# AI & Agent Features

This portfolio is agent-native. Everything a human reads here is also available to AI agents through open standards: an installable persona skill, a remote MCP server, llms.txt profiles, markdown content negotiation, a signed A2A agent card, and an on-chain ERC-8004 identity.

This page explains each feature and how to use it no API key or authentication required, everything is public and read-only.

## Frank OS : the Agent Skill

Frank OS is an installable [Agent Skill](https://code.claude.com/docs/en/skills) that gives your AI assistant Frank's persona: engineering philosophy, decision framework, Web3 security analysis protocol, and communication style. It is served live at [`/skill.md`](/skill.md) and is agent-agnostic, it works with any assistant that supports skills or accepts a markdown persona file.

The skill ships with four command modes: /frank-architect (architecture decisions as a short ADR), /frank-security (attack surface and trust-boundary review), /frank-dyor (mechanism-first Web3 research), and /frank-vibe (a one-line verdict: Strong / Promising but flawed / Weak / Bad idea).

Install as a personal skill in Claude Code:

```
mkdir -p ~/.claude/skills/frank-architect-builder
curl -o ~/.claude/skills/frank-architect-builder/SKILL.md \
  https://frankponcelet.com/skill.md
```

## MCP Server

A read-only Model Context Protocol server exposes Frank's profile, career, projects, speaking history, expertise, and persona as tools, resources, and prompts. It speaks Streamable HTTP (JSON-RPC 2.0) at [`/api/mcp`](/api/mcp/health) and is published to the official MCP registry as `com.frankponcelet/profile`.

Tools: get_profile, get_career, get_projects, get_speaking, get_expertise, get_engagement, get_current_focus, get_persona. Resources: the persona skill and the full llms.txt profile. Prompts: the same four command modes as the skill (frank-architect, frank-security, frank-dyor, frank-vibe).

- [`/api/mcp`](/api/mcp) — MCP endpoint (Streamable HTTP, POST)
- [`/api/mcp/health`](/api/mcp/health) — liveness probe

Add to Claude Code:

```
claude mcp add --transport http frank-poncelet \
  https://frankponcelet.com/api/mcp
```

Or any MCP client config:

```
{
  "mcpServers": {
    "frank-poncelet": {
      "type": "http",
      "url": "https://frankponcelet.com/api/mcp"
    }
  }
}
```

Quick test with curl:

```
curl -X POST https://frankponcelet.com/api/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```

## llms.txt & Agent-Readable Profiles

Following the [llms.txt convention](https://llmstxt.org), the site publishes a curated index and a full plain-text profile that agents can fetch without parsing HTML. An [`auth.md`](/auth.md) file declares that no authentication is required anywhere on this site.

- [`/llms.txt`](/llms.txt) — curated index for agents
- [`/llms-full.txt`](/llms-full.txt) — full profile in one file
- [`/auth.md`](/auth.md) — auth metadata — public site, no auth

## Markdown for Agents

Pages negotiate their representation: request the homepage, the privacy policy, or this page with `Accept: text/markdown` and you get markdown instead of HTML (with an x-markdown-tokens header reporting the token count). Agents that cannot set headers can use the path variants [`/index.md`](/index.md), [`/privacy.md`](/privacy.md) and [`/ai.md`](/ai.md).

Content negotiation:

```
curl -H "Accept: text/markdown" https://frankponcelet.com/
```

## WebMCP Browser Tools

For agents that browse with you, the site registers WebMCP tools on `navigator.modelContext` at page load: get_profile, list_projects, list_speaking, get_expertise, and a browser-only navigate_to_section. They mirror the HTTP MCP server and are feature-detected — a no-op in browsers without WebMCP support.

## A2A Agent Card

An [Agent2Agent (A2A)](https://a2a-protocol.org) v1.0 agent card describes this site as an agent peers can talk to. The card is JWS-signed (ES256) over a canonicalized payload; verify the signature against the published JWKS.

- [`/.well-known/agent-card.json`](/.well-known/agent-card.json) — signed A2A agent card
- [`/.well-known/jwks.json`](/.well-known/jwks.json) — public key for verification

## On-Chain Identity (ERC-8004)

The agent identity is anchored on-chain via [ERC-8004](https://eips.ethereum.org/EIPS/eip-8004): a registration file links the domain to the FrankNFT agent registered in the on-chain identity registry, and advertises OASF capability tags. This makes the agent identity verifiable in both directions — the site points at the chain, the chain points back at the site.

- [`/.well-known/agent-registration.json`](/.well-known/agent-registration.json) — ERC-8004 registration file

## Discovery Surface

Agents should not need to guess any of the above. The homepage response carries an RFC 8288 Link header advertising every endpoint, and the standard well-known documents mirror it:

- [`/.well-known/api-catalog`](/.well-known/api-catalog) — RFC 9727 API catalog (linkset+json)
- [`/.well-known/ai-catalog.json`](/.well-known/ai-catalog.json) — ARD ai-catalog (Agentic Resource Discovery v1.0) for agent registries
- [`/openapi.json`](/openapi.json) — OpenAPI 3.1 description of the HTTP surface
- [`/.well-known/mcp/server-card.json`](/.well-known/mcp/server-card.json) — SEP-1649 MCP server card
- [`/.well-known/agent-skills/index.json`](/.well-known/agent-skills/index.json) — Agent Skills discovery index (sha256 of the live skill)
- [`/security.txt`](/security.txt) — RFC 9116 security contact
- [`/robots.txt`](/robots.txt) — explicit AI-crawler opt-in + Content-Signal directives