humanMCP — kapoost

io.github.kapoostPublished by GitHub account kapoostv0.3.0Updated Oct 25, 2026

Personal MCP server for humans who create. Proof of authorship, license control.

The publisher's own server: TAP

Overview

AI-generated overview

A personal publishing server that lets an assistant browse, search and read one author's signed works, request licenses, and leave messages or questions.

What you can do
Browse and search published pieces, collections and typed data artifacts, with access gates respected when reading them or submitting challenge answers and access requests for locked items. Retrieve authorship certificates, provenance records and license terms, and declare intended use of a piece. Leave comments, send longer messages, and submit asynchronous questions to the author for later polling. Unlock session-gated context with a session code, then recall and save memories and read persona and skill catalogs. Search, list and read documents in the author's private vault when a bearer token is supplied.
When to use it
Useful when an assistant needs to work with one creator's published catalog: finding and reading pieces, checking authorship and licensing, or contacting the author asynchronously. Also relevant for agents that want to pull the author's persona prompts and skill playbooks into their own workflow.
Requirements
A remote streamable HTTP endpoint; no local runtime or package. No authentication is declared for public tools, but session-gated tools need a session code from bootstrap_session, and vault tools need an Authorization bearer token (edit or friend token). Owner-only tools need an owner token.
Before you install
Several tools write or send data: comments, messages, questions, license declarations, access requests, memories and vault writes are recorded and some are logged for audit. Vault access requires a bearer token and exposes private documents within its scope. Some pieces are gated by payment terms, time locks or trade rules, and licenses may carry prices. Questions and messages are answered on the author's own schedule.

Installation

In SourceWeft

  1. Open humanMCP — kapoost in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.kapoost%2Fhumanmcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "humanmcp-kapoost": {
      "type": "http",
      "url": "https://kapoost.humanmcp.net/mcp"
    }
  }
}

README

humanMCP

[smithery badge]

A 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.

What it is

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.

MCP Tools (37+)

Content & Discovery

ToolDescription
get_author_profileWho is kapoost — bio, content overview, how to browse
list_contentBrowse all pieces with metadata, filter by type or tag
read_contentRead a piece — respects all access gates
search_contentFull-text search across all pieces
request_accessGet gate details for locked content
submit_answerUnlock challenge-gated content
list_blobsBrowse typed data artifacts
read_blobRead image, contact, dataset, vector (respects audience)

IP & Verification

ToolDescription
verify_contentVerify Ed25519 signature
get_certificateFull IP certificate: license, price, originality index, hash, signature
upgrade_timestampUpgrade OTS proof to Bitcoin-anchored

Interaction

ToolDescription
request_licenseDeclare intended use, get terms, logged for audit
leave_commentLeave a reaction — visible in author dashboard
leave_messageSend a direct note (max 2000 chars, URLs welcome)
ask_humanAsk the author a question (private, async — returns question_id)
get_answerCheck if the author answered your question (by question_id)

Session & Context

ToolDescription
bootstrap_sessionUnlock private context with session code
recallRetrieve saved memories
rememberSave observations
query_vaultSearch personal knowledge vault
list_vaultList vault documents

Skills

ToolDescription
list_skills / get_skillAgent instruction catalog
upsert_skill / delete_skillManage skills (agent token)

Personas

ToolDescription
list_personas / get_personaYour expert team (requires session code or VAULT_URL)
upsert_persona / delete_personaManage personas (agent token)

Personas & skills: where they live

humanmcp-go is a framework. Persona prompts and skill bodies are yours — they don't ship in this repo. Two ways to supply them:

  1. 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.

  2. 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):

json
{"id":"hermes","name":"Hermes","role":"Process Optimizer","prompt":"<full system prompt>"}

Skill JSON shape (vault response):

json
{"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

ToolDescription
list_listings / read_listingBrowse classified ads
respond_to_listingSend response to listing
subscribe_listings / unsubscribe_listingsWebhook subscriptions

Federation

ToolDescription
list_peersList known humanMCP servers in the network
announce_peerAnnounce your server to join the network

Meta

ToolDescription
about_humanmcpOpen-source project info

Connect

json
{  "mcpServers": {    "kapoost": {      "type": "http",      "url": "https://kapoost.humanmcp.net/mcp"    }  }}

Content types

Pieces (Markdown files):

  • Types: poem, essay, note, artwork, image, contact
  • Access: public / members / locked
  • Gates: challenge (Q&A), time, manual, trade
  • Licenses: free, cc-by, cc-by-nc, commercial, exclusive, all-rights
  • Price: free-form string (e.g. "500 PLN", "$200", "trade")

Blobs (typed data artifacts):

  • Types: image, contact, vector, document, dataset, capsule, provenance
  • Audience: [agent:claude, human:alice, agent:*]
  • Auto-signed on save if SIGNING_PRIVATE_KEY is set
  • Provenance documents link to artwork pieces (certificate, sale, opinion, appraisal)

Ecosystem

  • humanMCP Marketplace — federated search across all humanMCP servers. Find listings, offers, trades by humans. MCP endpoint · Source
  • humanNetwork — wall-style aggregator showing chronological content from your followed humanMCP servers (stream.json preferred, MCP fallback)

Contact

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.

Intellectual property

Every piece is signed with Ed25519. get_certificate returns:

  • SHA-256 content hash
  • Ed25519 signature + public key
  • Originality Index (0.0–1.0): burstiness (Fano Factor), lexical density (CTTR), Shannon entropy, structural signature — grades S/A/B/C/D
  • License terms and price in sats (for commercial licenses)

Discovery & REST API

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 page

REST API (for agents without MCP):

  • GET /api/content — list all pieces
  • GET /api/content/{slug} — read piece
  • GET /api/search?q=... — full-text search
  • GET /api/profile — author name, bio, tags
  • GET /api/blobs — list data artifacts
  • GET /listings/feed.json — listings feed
  • GET /content/stream.json — unified content stream (pieces + listings, for humanNetwork)

SEO:

  • robots.txt, sitemap.xml, humans.txt

Limits

FieldLimit
Message / comment text2000 chars
Blob inline text512 KB
File upload50 MB
Slug64 chars
Title256 chars

Features

  • i18n — PL/EN language toggle on main page (EN default, stored in localStorage)
  • License wizard — per-piece usage rules: what humans may do, what AI agents may do
  • Artworks — photo upload, medium, dimensions, year, provenance documents
  • Provenance — attach certificates, sale records, expert opinions to artworks (signed)
  • ask_human — agents can ask the author questions privately (async Q&A, invisible to public)
  • Federation — peer discovery via list_peers / announce_peer MCP tools and /api/peers REST
  • Dynamic sections — main page shows only sections with published content
  • Free-form pricing — any currency, any format ("500 PLN", "$200", "trade only")

Stack

  • Go 1.22, zero external dependencies
  • Fly.io (region: waw), persistent volume at /data
  • Ed25519 signing (stdlib crypto)
  • Plain Markdown files as database
  • No JS except 8-line drag-drop on /new page

1-click deploy

bash
git clone https://github.com/kapoost/humanmcp-go.gitcd humanmcp-gobash setup.sh

The script asks for your name and bio, then:

  • Creates a Fly.io app (free tier)
  • Generates Ed25519 signing keys
  • Sets secrets and deploys
  • Prints your login token and 1-click follow link

Done in ~2 minutes. You get:

  • https://yourname.humanmcp.net — your server
  • https://yourname.humanmcp.net/connect — share with friends
  • https://humanmcp.net/humannetwork.html?add=https://yourname.humanmcp.net — 1-click follow

Run locally

bash
go build ./cmd/server/EDIT_TOKEN=secret AUTHOR_NAME=yourname ./server

Manual deploy

bash
fly launch --name yourname-humanmcpfly secrets set EDIT_TOKEN=secret AUTHOR_NAME=yournamefly deploy

Signing keys (optional but recommended)

bash
go run ./cmd/keygen/fly secrets set SIGNING_PRIVATE_KEY="..." SIGNING_PUBLIC_KEY="..."

Future

  • C2PA manifest embedding for blob files (when CA trust chain opens to individuals)
  • Lightning Network payment gate for commercial licenses
  • Scored conversational gate (agent brings API key, Claude evaluates answers)
  • IP rate limiting + engagement tokens for anti-spam

Tests

136 tests across content, MCP, and upload/signature/license suites.

bash
go test ./...

Source: README.md at commit d5b43b9

Tools

43

about_humanmcp

Self-description of this humanMCP server. Deterministic, no bootstrap required — call this first to decide whether the rest of the API is relevant.

Takes no parameters.

ask_human

Submit an async question to kapoost. Returns an ID. Rate-limited 5/hr/IP. Poll fetch_answer later — kapoost answers on his own schedule (minutes, hours, or days). ALWAYS set `from` to a stable name for yourself: with it, sending the same question again returns the answer instead of creating a duplicate, which is the reliable path when your runtime cannot keep the ID between sessions.

Parametersfromcontextquestionrequired

bootstrap_session

Validate the Polish poetry session code, then emit the full team briefing (guardian + style + personas + skills + persist block). Rate-limited 5/min/IP.

Parameterscoderequired

delete_skill

Delete a skill by slug. Owner-only: requires Authorization: Bearer <token>.

Parametersslugrequired

fetch_answer

Poll for an answer to an ask_human question. Marks the question as fetched the first time an answer is returned. Rate-limited 30/hr/IP.

Parametersidrequired

fetch_narada_result

Poll a narada job by ID. Statuses: pending, running, done, failed. When done, returns all persona voices.

Parametersidrequired

get_author_profile

Author identity, bio, and a browsing cheatsheet. Records a profile-view event.

Takes no parameters.

get_certificate

Return a formatted copyright/authenticity certificate for a piece.

Parametersslugrequired

get_persona

Return one persona's full prompt by slug. Session-gated except for Hodor (guardian rules must always apply). Pass session_token if your client cannot set an Authorization header.

Parametersslugrequiredsession_token

get_persona_journal

Read a persona's raw reflection journal. Owner-only — the journal is a private feedback loop, not for external callers.

Parametersslugrequired

get_skill

Return one skill's full body by slug. Session-gated except for -public suffixed skills (guardian bypass). Pass session_token if your client cannot set an Authorization header.

Parametersslugrequiredsession_token

leave_comment

Attach a short comment (≤280 chars) to a piece kapoost has published. Truncated silently past the limit.

Parametersfromslugrequiredtextrequired

leave_message

Send kapoost a longer message. context REQUIRED (why you're writing / which piece / which task). contact optional — without it no reply is possible.

Parametersfromtextrequiredcontactcontextrequiredregarding

list_blobs

List typed data artifacts (images, contact, vectors, documents, datasets, capsules). Filter by blob_type. Readable-column reflects caller_kind + caller_id vs audience.

Parametersblob_typecaller_idcaller_kind

list_collection

List works kapoost owns but did NOT create. Public items always; members-only surface only after session activation.

Parameterssession_token

list_content

List published pieces (slug, title, type, access, tags). Optional type/tag filters.

Parameterstagtype

list_personas

List every persona (slug, title, role). Full prompts unlock after bootstrap_session.

Takes no parameters.

list_provenance

List provenance items (chain of custody, certificates, invoices) for an artwork slug. Tries piece then collection.

Parametersslugrequired

list_skill_groups

Index of every skill tag in use, with slugs per group. Public — no bootstrap required.

Takes no parameters.

list_skills

List skills (slug, category, title, tags). Optional category / tag filters.

Parameterstagcategory

load_skill_group

Bulk-fetch every skill tagged with the given group name. Respects the bootstrap gate per-skill: -public suffix bypasses, everything else needs session.

Parametersnamerequiredsession_token

mysloodsiewnia_get

Fetch one document from kapoost's vault by slug. Requires Authorization: Bearer <edit token or friend token>. Friend tokens: vault-side filter enforces scope + access:private invisibility — an out-of-scope or private slug returns not_found. Vault offline ⇒ {status:offline}.

Parametersdoc_slugrequired

mysloodsiewnia_list

Enumerate vault documents without FTS — for browsing by type or paginating. Requires Authorization: Bearer <edit token or friend token>. Friend tokens see only their scoped doc_types; access:private is invisible. Args: {doc_type?: string filter (note/pdf/literatura/calendar_event/...), limit?: int 1-200 default 50, offset?: int default 0}. Returns [{slug, title, doc_type, created_at, chunk_count}]. Vault offline ⇒ {status:offline}.

Parameterslimitoffsetdoc_type

mysloodsiewnia_status

Read-only liveness probe on kapoost's local vault (mysłoodsiewnia). Returns {status: online|degraded|offline, last_seen, commit_sha, personas_updated_at, skills_updated_at}. Offline is a stable state — retry later, don't escalate. Requires Authorization: Bearer <edit token or friend token>.

Takes no parameters.

mysloodsiewnia_write

Ingest a new document into kapoost's vault (wave 2). OWNER-ONLY — friend tokens receive {status:write_denied,reason:owner_only}. Args: {doc_type (required), title (required), body (required, ≤100 KiB), source_path?, meta?}. Requires Authorization: Bearer <owner token>. On Unauthorized: obtain the token by either (a) calling bootstrap_session(code=<owner poet fragment>) and reading SESSION_TOKEN from the response briefing (1h TTL, preferred for agents that already know the code), or (b) if you have shell access on kapoost's Mac, running `security find-generic-password -s humanmcp-edit-token -w` to fetch the persistent EDIT_TOKEN. Server-side vault auto-tags via:humanmcp-bridge; op_id is dedup key (idempotent retries safe). Delete is permanently unavailable. Envelopes: {status:online, op_id, result:{slug, created_at}}, {status:invalid_args}, {status:payload_too_large, limit, got}, {status:offline}, {status:vault_timeout}, {status:vault_error, error}.

Parametersbodyrequiredmetatitlerequireddoc_typerequiredsource_path

prepare_narada

Offline narada: returns the panel plus each persona's ready-to-run SYSTEM/USER prompts so YOU run them as your own subagents, instead of the server generating voices. No LLM cost, no rate limit, nothing recorded — no narada ID and no journal feedback. Prefer this over run_narada when your subagents can read material the server cannot (a repository, local files) or when the server has no API key. Session-gated.

Parameterscontextrequiredpersonassession_token

read_blob

Read one blob by slug. Returns text or base64-encoded data. Access-gated by audience unless blob is public.

Parametersslugrequiredcaller_idcaller_kind

read_collection_item

Full record for one collection item + dossier count. Access-gated: private is never visible, members needs session.

Parametersslugrequiredsession_token

read_content

Read a public piece by slug. Locked pieces return a hint pointing at request_access.

Parametersslugrequired

read_provenance

Return one provenance item with resolvable file URLs. slug + id required.

Parametersidrequiredslugrequired

recall

List memories saved under the given code, optionally substring-filtered by query. Session-gated for symmetry with remember.

Parameterscoderequiredlimitquerysession_token

record_persona_reflection

Ask a persona to write a lesson-for-self after a rolled-back narada recommendation. Appends to the persona's journal via Sonnet/Haiku. Owner-only.

Parametersnarada_idrequiredpersona_slugrequirederror_contextrequired

remember

Persist a note under the given session code. Session-gated — bootstrap_session first. Callers sharing the code share the memory.

Parameterscoderequiredfromtagstextrequiredsession_token

request_access

Get the gate details for a locked piece: challenge question, manual-review flow, time-lock countdown, payment terms, or trade rules.

Parametersslugrequired

request_license

Declare intended use of a piece, get licensing terms + audit-log entry. caller_id is REQUIRED (whitespace-only rejected — storyboard-pinned).

Parametersslugrequiredcaller_idrequiredintended_userequired

run_narada

Create an async narada job: server routes context to 3-5 personas via keyword manifest, then generates each voice via Sonnet 4.6 (Haiku 4.5 for journal recaps). Returns job ID for polling. Pass `personas` to pick the voices yourself and skip the router entirely — the router matches keywords only and cannot read a request to include or exclude someone written in the context.

Parametersfromcontextrequiredpersonas

search_content

Search kapoost's pieces by words in title, tags, description and body. Every word must match (AND). Polish diacritics are folded, so "czlowieczenstwa" finds "człowieczeństwa". Use this BEFORE ask_human — most questions about which piece is which are answered here instantly, while ask_human waits for a human. Locked pieces are matched by title and tags only; their body is never searched or quoted.

Parameterslimitqueryrequired

submit_answer

Submit an answer to a challenge-gated piece. Correct answer unlocks and returns the full body.

Parametersslugrequiredanswerrequired

suggest_skills

Deterministic manifest→tag mapping. Given files + languages + git_origin, returns up to 8 skill slugs and up to 5 personas, each with the reason it fired. No LLM classification.

Parametersfileslanguagesgit_origin

synthesise_persona_patterns

Force-run Sonnet synthesis over a persona's raw journal, replacing the previous pattern set. Owner-only — paid + writes internal state.

Parametersslugrequired

upsert_skill

Create or replace a skill by slug. Owner-only: requires Authorization: Bearer <token>. Writes JSON to content/skills/<slug>.json.

Parametersbodyrequiredslugrequiredtagstitlerequiredcategoryrequired

verify_content

Verify a piece's Ed25519 signature against the server's owner public key.

Parametersslugrequired

Version history

1
  1. v0.3.0LatestSep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.

Other Human integrations