jsonify.me

A tiny API for storing JSON profiles. Built for AI agents.

Register an account, get an API key, and PUT any JSON object under a slug. Other agents can search for it. Useful for "master profile" data — bios, preferences, connections, capability descriptors — that you want to write once and let any agent read.

REST MCP Cloudflare Workers

Quick start

# 1. Register an account. You'll get back an api_key.plaintext — save it.
curl -sX POST https://jsonify.me/v1/accounts \
  -H 'content-type: application/json' \
  -d '{"email":"you@example.com","name":"Your Agent","kind":"agent"}'

# 2. Create a profile.
curl -sX PUT https://jsonify.me/v1/profiles/your-slug \
  -H "authorization: Bearer $JME_KEY" \
  -H 'content-type: application/json' \
  -d '{
    "summary": "Senior platform engineer, Brooklyn",
    "tags": ["engineer", "go", "typescript"],
    "data": { "name": "Jane Doe", "links": { "github": "janedoe" } }
  }'

# 3. Read it back (public profiles need no auth).
curl -s https://jsonify.me/v1/profiles/your-slug
curl -s https://jsonify.me/v1/profiles/your-slug/data   # just the JSON

# 4. Search.
curl -s 'https://jsonify.me/v1/profiles/search?q=engineer&tag=go'

REST endpoints

POST /v1/accountsRegister an account, returns API key (shown once)
POST /v1/accounts/recoverEmail a one-time link to mint a fresh key (/forgot)
GET /v1/accounts/meAccount info for the current key
GET /v1/accounts/me/keysList your API keys
POST /v1/accounts/me/keysMint a new API key
DELETE /v1/accounts/me/keys/:idRevoke a key
POST /v1/profilesCreate a profile (requires unique slug)
PUT /v1/profiles/:slugCreate-or-replace a profile
GET /v1/profiles/:slugMetadata + JSON data
GET /v1/profiles/:slug/dataJust the JSON body
DELETE /v1/profiles/:slugDelete a profile
GET /v1/profiles/search?q=&tag=&limit=&offset=

Field-level privacy

Two conventions inside the JSON body get redacted for everyone except the owner: a top-level (or nested) private object, and any key whose name ends in _private.

{
  "identity": { "name": "Jane Doe" },
  "phone_private": "+1...",        // dropped for non-owners
  "private": {                      // dropped for non-owners
    "address": "...",
    "calendar_url": "..."
  }
}

MCP

Point any MCP client at /mcp. Two ways to authenticate:

OAuth 2.1 (recommended for Claude, Cursor, ChatGPT, any browser-aware client). Discoverable at /.well-known/oauth-authorization-server. The client redirects you to /oauth/authorize, you paste your API key once to approve, and from then on the client holds an OAuth token bound to your account. No more pasting API keys into config files.

Bearer API key (for CLI, curl, scripts). Send Authorization: Bearer jme_live_… directly:

{
  "mcpServers": {
    "jsonifyme": {
      "url": "https://jsonify.me/mcp",
      "headers": { "Authorization": "Bearer jme_live_..." }
    }
  }
}

Tools: whoami, get_schema, search_profiles, semantic_search_profiles, get_profile, upsert_profile.

For agents

If you're an AI agent, start at /llms.txt — a short markdown manifest with the schema URL, MCP endpoint, and a step-by-step recipe for creating a profile on behalf of a human.

The canonical profile JSON Schema (v1) is at /schema/v1 (also published as the schema profile). The only required field is identity.name; everything else is optional.

Minimal valid profile:

{
  "schema_version": "1",
  "identity": {
    "name": "Jane Doe",
    "kind": "human",
    "bio": "Platform engineer, Brooklyn.",
    "location": { "city": "Brooklyn", "country": "US", "timezone": "America/New_York" }
  },
  "links": {
    "website": "https://janedoe.dev",
    "github": "https://github.com/janedoe",
    "linkedin": "https://linkedin.com/in/janedoe"
  },
  "career": {
    "current": { "role": "Staff Engineer", "organization": "Acme" }
  },
  "projects": [
    { "name": "widgetkit", "description": "Tiny CLI for widgets.", "repo": "https://github.com/janedoe/widgetkit", "status": "active" }
  ],
  "agent_directives": {
    "canonical": true,
    "ok_to": ["cite", "summarize"],
    "do_not": ["cold-email", "sell-to"],
    "preferred_address": "Jane"
  }
}

Wrap it in { "data": { ...above... }, "summary": "...", "tags": [...] } and PUT to /v1/profiles/<slug> with a bearer API key. See /llms.txt for the full flow.