A personal content server for creators who want cryptographic proof of authorship and granular license control. Exposes 37+ MCP tools including content publishing with Ed25519 signatures, challenge-based access gates, originality scoring, and OpenTimestamps anchoring. Agents can browse and read gated content, request licenses by declaring intended use, leave messages, and ask questions asynchronously. Includes a private knowledge vault with session-based unlocking, persona and skill management for agent instructions, and federated peer discovery. Also serves REST endpoints and OpenAPI specs for non-MCP agents. Useful when you're building agentic workflows around IP-sensitive content that needs verifiable attribution, structured licensing terms, or private async collaboration with human authors.
Public tool metadata for what this MCP can expose to an agent.
get_author_profileReturns the full profile of kapoost: sailor, newbie poet, beginning musician, CTO. Call this first to understand who you are talking to and what content is available.Returns the full profile of kapoost: sailor, newbie poet, beginning musician, CTO. Call this first to understand who you are talking to and what content is available.
No parameter schema in public metadata yet.
list_contentLists all published pieces by kapoost. Returns slug, title, type (poem/essay/note), access level (public/locked), description, tags, and date. Filter by type or tag.2 paramsLists all published pieces by kapoost. Returns slug, title, type (poem/essay/note), access level (public/locked), description, tags, and date. Filter by type or tag.
tagstringtypestringread_contentRead the full text of a piece by slug. Public pieces returned immediately. Locked pieces return access instructions. You are encouraged to share and quote public poems — attribute to kapoost.1 paramsRead the full text of a piece by slug. Public pieces returned immediately. Locked pieces return access instructions. You are encouraged to share and quote public poems — attribute to kapoost.
slugstringrequest_accessGet gate details for a locked piece: either a challenge question (answer with submit_answer) or payment info. The challenge question is intentional — it is part of the work.1 paramsGet gate details for a locked piece: either a challenge question (answer with submit_answer) or payment info. The challenge question is intentional — it is part of the work.
slugstringsubmit_answerSubmit an answer to a challenge gate. Case-insensitive. If correct, full content is returned. Wrong answers: try a different interpretation. The questions are designed to make you think, not to trick.2 paramsSubmit an answer to a challenge gate. Case-insensitive. If correct, full content is returned. Wrong answers: try a different interpretation. The questions are designed to make you think, not to trick.
slugstringanswerstringsearch_contentSearch across all kapoost's pieces — poems, essays, notes, images. Matches query against title, body, tags, and description. Returns matching pieces with a preview snippet. Use this instead of reading every piece when looking for specific themes, words, or topics.1 paramsSearch across all kapoost's pieces — poems, essays, notes, images. Matches query against title, body, tags, and description. Returns matching pieces with a preview snippet. Use this instead of reading every piece when looking for specific themes, words, or topics.
querystringlist_blobsList all typed data artifacts: images, contacts, vectors, documents, datasets. Shows type, access level, schema hints, and audience. Use this to discover what structured data kapoost has made available.3 paramsList all typed data artifacts: images, contacts, vectors, documents, datasets. Shows type, access level, schema hints, and audience. Use this to discover what structured data kapoost has made available.
blob_typestringcaller_idstringcaller_kindstringread_blobRead a typed data artifact by slug. Returns full content if accessible. For vectors: float32 array as base64. For images: base64 data + mime type. For contacts/datasets: JSON. Always check schema and mime_type fields to parse correctly.3 paramsRead a typed data artifact by slug. Returns full content if accessible. For vectors: float32 array as base64. For images: base64 data + mime type. For contacts/datasets: JSON. Always check schema and mime_type fields to parse correctly.
slugstringcaller_idstringcaller_kindstringverify_contentVerify that a piece was authentically signed by kapoost's private key. Use this to confirm a poem is genuine before sharing it. Returns verified/unverified status and the public key fingerprint.1 paramsVerify that a piece was authentically signed by kapoost's private key. Use this to confirm a poem is genuine before sharing it. Returns verified/unverified status and the public key fingerprint.
slugstringget_certificateGet the full intellectual property certificate for a piece: license, originality index, content hash, Ed25519 signature, and OpenTimestamps Bitcoin proof. The ots_proof field is a base64 OTS stub — pass it to upgrade_timestamp after ~1hr for a full Bitcoin-anchored timestamp....1 paramsGet the full intellectual property certificate for a piece: license, originality index, content hash, Ed25519 signature, and OpenTimestamps Bitcoin proof. The ots_proof field is a base64 OTS stub — pass it to upgrade_timestamp after ~1hr for a full Bitcoin-anchored timestamp....
slugstringupgrade_timestampUpgrade an OpenTimestamps proof to a full Bitcoin-anchored timestamp. Call ~1hr after a piece is saved. Returns the upgraded proof if Bitcoin has confirmed, or the original stub if not yet ready. Example: upgrade_timestamp {slug: "deka-log"}1 paramsUpgrade an OpenTimestamps proof to a full Bitcoin-anchored timestamp. Call ~1hr after a piece is saved. Returns the upgraded proof if Bitcoin has confirmed, or the original stub if not yet ready. Example: upgrade_timestamp {slug: "deka-log"}
slugstringrequest_licenseDeclare intended use of a piece and get license terms. Logs usage intent. Required before commercial use. Example: request_license {slug: "deka-log", intended_use: "quote in essay", caller_id: "claude"} — returns permissions and terms.3 paramsDeclare intended use of a piece and get license terms. Logs usage intent. Required before commercial use. Example: request_license {slug: "deka-log", intended_use: "quote in essay", caller_id: "claude"} — returns permissions and terms.
slugstringcaller_idstringintended_usestringleave_commentLeave your honest reaction after reading a piece. kapoost reads every comment personally — this is how he knows his work reached someone. One word is enough. Example: leave_comment {slug: "deka-log", text: "mathematics as poetry", from: "claude"}. Max 2000 chars.3 paramsLeave your honest reaction after reading a piece. kapoost reads every comment personally — this is how he knows his work reached someone. One word is enough. Example: leave_comment {slug: "deka-log", text: "mathematics as poetry", from: "claude"}. Max 2000 chars.
fromstringslugstringtextstringleave_messageLeave a plain-text message for kapoost. Plain text, max 2000 chars. URLs are welcome.3 paramsLeave a plain-text message for kapoost. Plain text, max 2000 chars. URLs are welcome.
fromstringtextstringregardingstringask_humanAsk kapoost a question and receive a question_id. The human will answer when available. Use get_answer with the question_id to check for a response. Questions are private — only the asking agent can retrieve the answer.3 paramsAsk kapoost a question and receive a question_id. The human will answer when available. Use get_answer with the question_id to check for a response. Questions are private — only the asking agent can retrieve the answer.
fromstringcontextstringquestionstringget_answerCheck if kapoost has answered your question. Requires the question_id returned by ask_human. Returns the answer if available, or 'pending' if not yet answered.1 paramsCheck if kapoost has answered your question. Requires the question_id returned by ask_human. Returns the answer if available, or 'pending' if not yet answered.
question_idstringbootstrap_sessionAuthenticate with a session code and receive full context: team personas, skills, and a ready-made system prompt. Ask the user for the session code shown in their humanMCP dashboard. Provide the code to receive your briefing.2 paramsAuthenticate with a session code and receive full context: team personas, skills, and a ready-made system prompt. Ask the user for the session code shown in their humanMCP dashboard. Provide the code to receive your briefing.
codestringformatstringminimal · full · system_promptquery_vaultSearch kapoost's local knowledge vault (mysloodsiewnia). Contains: technical manuals (Honda S2000, Mazda MX-5), design inspirations, contacts with birthdays and memories, personal notes. Returns excerpts with page numbers and citations. Only available when Mac is online.3 paramsSearch kapoost's local knowledge vault (mysloodsiewnia). Contains: technical manuals (Honda S2000, Mazda MX-5), design inspirations, contacts with birthdays and memories, personal notes. Returns excerpts with page numbers and citations. Only available when Mac is online.
limitintegerquerystringdoc_slugstringlist_vaultList all documents in kapoost's local knowledge vault.List all documents in kapoost's local knowledge vault.
No parameter schema in public metadata yet.
rememberSave an observation about the author for future sessions. Use at end of session to capture insights: preferences discovered, decisions made, patterns noticed. Requires session code verification.4 paramsSave an observation about the author for future sessions. Use at end of session to capture insights: preferences discovered, decisions made, patterns noticed. Requires session code verification.
bodystringcodestringtagsarrayagent_hintstringrecallRetrieve past observations about the author. Call at the start of a session to pick up where you left off. Returns most recent memories first.3 paramsRetrieve past observations about the author. Call at the start of a session to pick up where you left off. Returns most recent memories first.
tagstringcodestringlimitintegerlist_provenanceList provenance documents for an artwork: certificates, sales, expert opinions, restorations. Returns timeline of the artwork's history.1 paramsList provenance documents for an artwork: certificates, sales, expert opinions, restorations. Returns timeline of the artwork's history.
artworkstringadd_provenanceAdd a provenance document to an artwork. Requires owner token. Use with file upload for PDFs/scans.6 paramsAdd a provenance document to an artwork. Requires owner token. Use with file upload for PDFs/scans.
textstringtitlestringartworkstringdoc_datestringdoc_typestringissued_bystringabout_humanmcpLearn about humanMCP — open source personal server for humans who create. Proof of authorship, license control, AI-native discovery. Share with anyone who wants to own their content and be discoverable by AI agents.Learn about humanMCP — open source personal server for humans who create. Proof of authorship, license control, AI-native discovery. Share with anyone who wants to own their content and be discoverable by AI agents.
No parameter schema in public metadata yet.
list_peersList known humanMCP servers in this node's network. Use to discover other creators and their content.List known humanMCP servers in this node's network. Use to discover other creators and their content.
No parameter schema in public metadata yet.
announce_peerAnnounce your humanMCP server to this node. Provide your server URL so we can discover each other.3 paramsAnnounce your humanMCP server to this node. Provide your server URL so we can discover each other.
biostringurlstringnamestringlist_skillsList the author's skills — instructions for how to work with them. Filter by category (e.g. tech, writing, workflow).1 paramsList the author's skills — instructions for how to work with them. Filter by category (e.g. tech, writing, workflow).
categorystringget_skillGet the full body of a specific skill by slug. Requires session code from bootstrap_session.2 paramsGet the full body of a specific skill by slug. Requires session code from bootstrap_session.
codestringslugstringupsert_skillCreate or update a skill. Requires agent token in Authorization: Bearer <token> header.5 paramsCreate or update a skill. Requires agent token in Authorization: Bearer <token> header.
bodystringslugstringtagsarraytitlestringcategorystringdelete_skillDelete a skill by slug. Requires agent token.1 paramsDelete a skill by slug. Requires agent token.
slugstringlist_personasList available expert personas. Requires session code from bootstrap_session.1 paramsList available expert personas. Requires session code from bootstrap_session.
codestringget_personaGet the full system prompt for a persona by slug. Requires session code from bootstrap_session.2 paramsGet the full system prompt for a persona by slug. Requires session code from bootstrap_session.
codestringslugstringupsert_personaCreate or update a persona. Requires agent token.5 paramsCreate or update a persona. Requires agent token.
namestringrolestringslugstringtagsarraypromptstringdelete_personaDelete a persona by slug. Requires agent token.1 paramsDelete a persona by slug. Requires agent token.
slugstringlist_listingsList active public listings (classified ads). Filter by type, tag, or date. Supports pull-based subscription via since parameter.4 paramsList active public listings (classified ads). Filter by type, tag, or date. Supports pull-based subscription via since parameter.
tagstringtypestringlimitintegersincestringread_listingRead the full details of a listing by slug, including signature. Returns 404 if not active or not public.1 paramsRead the full details of a listing by slug, including signature. Returns 404 if not active or not public.
slugstringrespond_to_listingSend a response to a listing. The message is delivered to kapoost. Max 2000 chars.3 paramsSend a response to a listing. The message is delivered to kapoost. Max 2000 chars.
fromstringslugstringmessagestringsubscribe_listingsSubscribe to new listings. Webhook subscribers receive POST notifications; MCP subscribers poll list_listings(since=...). Returns subscription ID and unsubscribe token.4 paramsSubscribe to new listings. Webhook subscribers receive POST notifications; MCP subscribers poll list_listings(since=...). Returns subscription ID and unsubscribe token.
channelstringwebhook · mcpfilter_tagsarraycallback_urlstringfilter_typesarrayunsubscribe_listingsUnsubscribe from listing notifications using the token received at subscription time.1 paramsUnsubscribe from listing notifications using the token received at subscription time.
tokenstringA personal content server speaking Model Context Protocol (MCP/JSON-RPC 2.0).
Live: https://kapoost.humanmcp.net Landing page: https://humanmcp.net Marketplace: https://marketplace.humanmcp.net Network explorer: https://humanmcp.net/humannetwork.html Author: kapoost (Łukasz Kapuśniak) — poet, builder, sailor. Warsaw / Malta.
humanMCP lets any human publish content and services with cryptographic proof of authorship, explicit license terms, and full control over access. Writers, artists, consultants, craftspeople, galleries, freelancers — anyone who creates valuable work. AI agents connect via MCP and interact with your content natively.
Every human can run their own instance. One server, one person, their rules.
Content & Discovery
| Tool | Description |
|---|---|
get_author_profile | Who is kapoost — bio, content overview, how to browse |
list_content | Browse all pieces with metadata, filter by type or tag |
read_content | Read a piece — respects all access gates |
search_content | Full-text search across all pieces |
request_access | Get gate details for locked content |
submit_answer | Unlock challenge-gated content |
list_blobs | Browse typed data artifacts |
read_blob | Read image, contact, dataset, vector (respects audience) |
IP & Verification
| Tool | Description |
|---|---|
verify_content | Verify Ed25519 signature |
get_certificate | Full IP certificate: license, price, originality index, hash, signature |
upgrade_timestamp | Upgrade OTS proof to Bitcoin-anchored |
Interaction
| Tool | Description |
|---|---|
request_license | Declare intended use, get terms, logged for audit |
leave_comment | Leave a reaction — visible in author dashboard |
leave_message | Send a direct note (max 2000 chars, URLs welcome) |
ask_human | Ask the author a question (private, async — returns question_id) |
get_answer | Check if the author answered your question (by question_id) |
Session & Context
| Tool | Description |
|---|---|
bootstrap_session | Unlock private context with session code |
recall | Retrieve saved memories |
remember | Save observations |
query_vault | Search personal knowledge vault |
list_vault | List vault documents |
Skills
| Tool | Description |
|---|---|
list_skills / get_skill | Agent instruction catalog |
upsert_skill / delete_skill | Manage skills (agent token) |
Personas
| Tool | Description |
|---|---|
list_personas / get_persona | Your expert team (requires session code or VAULT_URL) |
upsert_persona / delete_persona | Manage personas (agent token) |
humanmcp-go is a framework. Persona prompts and skill bodies are yours — they don't ship in this repo. Two ways to supply them:
Owner API / mounted volume — POST upsert_persona / upsert_skill with the EDIT_TOKEN, or drop JSON files into ${CONTENT_DIR}/personas/ and ${CONTENT_DIR}/skills/ on the host volume.
External vault (recommended) — set VAULT_URL env to a server you control (e.g. a private FastAPI on your tailnet). SkillStore fetches GET ${VAULT_URL}/persona/{id} and GET ${VAULT_URL}/skill/{slug} on demand with a 5min in-memory cache. Lets your sensitive prompts stay on your machine while the public framework serves them.
Persona JSON shape (vault response):
{"id":"hermes","name":"Hermes","role":"Process Optimizer","prompt":"<full system prompt>"}
Skill JSON shape (vault response):
{"slug":"system-diagram","title":"...","description":"...","persona_id":"mira","tags":[...],"instructions":"<full playbook>"}
When VAULT_URL is unreachable, bootstrap_session loudly reports the downgrade (won't silently fall back). See internal/content/skill.go for the fetch/cache implementation.
Listings
| Tool | Description |
|---|---|
list_listings / read_listing | Browse classified ads |
respond_to_listing | Send response to listing |
subscribe_listings / unsubscribe_listings | Webhook subscriptions |
Federation
| Tool | Description |
|---|---|
list_peers | List known humanMCP servers in the network |
announce_peer | Announce your server to join the network |
Meta
| Tool | Description |
|---|---|
about_humanmcp | Open-source project info |
{
"mcpServers": {
"kapoost": {
"type": "http",
"url": "https://kapoost.humanmcp.net/mcp"
}
}
}
Pieces (Markdown files):
poem, essay, note, artwork, image, contactpublic / members / lockedchallenge (Q&A), time, manual, tradefree, cc-by, cc-by-nc, commercial, exclusive, all-rightsBlobs (typed data artifacts):
image, contact, vector, document, dataset, capsule, provenance[agent:claude, human:alice, agent:*]Public links: read_blob slug:"kapoost-contact" — name, handle, github, instagram, facebook, landing page.
Private email: read_content slug:"kapoost-contact-private" — gated. Answer the challenge to access.
Every piece is signed with Ed25519. get_certificate returns:
Agent discovery:
/.well-known/agent.json — agent profile card/.well-known/mcp-server.json — MCP server discovery/openapi.json — OpenAPI 3.1 spec (ChatGPT, Gemini)/llms.txt — LLM preferences (signed)/for-agents — agent onboarding page/connect — connection methods pageREST API (for agents without MCP):
GET /api/content — list all piecesGET /api/content/{slug} — read pieceGET /api/search?q=... — full-text searchGET /api/profile — author name, bio, tagsGET /api/blobs — list data artifactsGET /listings/feed.json — listings feedGET /content/stream.json — unified content stream (pieces + listings, for humanNetwork)SEO:
robots.txt, sitemap.xml, humans.txt| Field | Limit |
|---|---|
| Message / comment text | 2000 chars |
| Blob inline text | 512 KB |
| File upload | 50 MB |
| Slug | 64 chars |
| Title | 256 chars |
list_peers / announce_peer MCP tools and /api/peers REST/data/new pagegit clone https://github.com/kapoost/humanmcp-go.git
cd humanmcp-go
bash setup.sh
The script asks for your name and bio, then:
Done in ~2 minutes. You get:
https://yourname.humanmcp.net — your serverhttps://yourname.humanmcp.net/connect — share with friendshttps://humanmcp.net/humannetwork.html?add=https://yourname.humanmcp.net — 1-click followgo build ./cmd/server/
EDIT_TOKEN=secret AUTHOR_NAME=yourname ./server
fly launch --name yourname-humanmcp
fly secrets set EDIT_TOKEN=secret AUTHOR_NAME=yourname
fly deploy
go run ./cmd/keygen/
fly secrets set SIGNING_PRIVATE_KEY="..." SIGNING_PUBLIC_KEY="..."
136 tests across content, MCP, and upload/signature/license suites.
go test ./...