humanMCP — kapoost

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

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
75%
Naming quality
92%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'read_provenance' description lacks action verbin read_provenance

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,922Tokens (tool definitions)
~446 BTypical response size
Significant attention impact (3.06% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "humanmcp": {
      "url": "https://kapoost-humanmcp.fly.dev/mcp"
    }
  }
}

Remote endpoints

https://kapoost-humanmcp.fly.dev/mcpstreamable-http
https://kapoost.humanmcp.net/mcpstreamable-http

What it can do

Tool inventory

Tools (43)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
⚪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.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟡ask_human(question, context, from)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "question": {
      "type": "string"
    },
    "context": {
      "type": "string"
    },
    "from": {
      "type": "string"
    }
  },
  "required": [
    "question"
  ]
}
⚪bootstrap_session(code)

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

Input Schema

{
  "type": "object",
  "properties": {
    "code": {
      "type": "string"
    }
  },
  "required": [
    "code"
  ]
}
🔴delete_skill(slug)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟢fetch_answer(id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ]
}
🟢fetch_narada_result(id)

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

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ]
}
🟢get_author_profile

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

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢get_certificate(slug)

Return a formatted copyright/authenticity certificate for a piece.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟡get_persona(slug, session_token)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "session_token": {
      "type": "string",
      "description": "Optional. The SESSION_TOKEN emitted by bootstrap_session. Pass it here when your client cannot set a per-call Authorization: Bearer header."
    }
  },
  "required": [
    "slug"
  ]
}
🟢get_persona_journal(slug)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟡get_skill(slug, session_token)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "session_token": {
      "type": "string",
      "description": "Optional. The SESSION_TOKEN emitted by bootstrap_session. Pass it here when your client cannot set a per-call Authorization: Bearer header."
    }
  },
  "required": [
    "slug"
  ]
}
⚪leave_comment(slug, text, from)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "text": {
      "type": "string"
    },
    "from": {
      "type": "string"
    }
  },
  "required": [
    "slug",
    "text"
  ]
}
🟡leave_message(text, context, contact, from, regarding)

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

Input Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string"
    },
    "context": {
      "type": "string"
    },
    "contact": {
      "type": "string"
    },
    "from": {
      "type": "string"
    },
    "regarding": {
      "type": "string"
    }
  },
  "required": [
    "text",
    "context"
  ]
}
🟢list_blobs(blob_type, caller_kind, caller_id)

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

Input Schema

{
  "type": "object",
  "properties": {
    "blob_type": {
      "type": "string"
    },
    "caller_kind": {
      "type": "string"
    },
    "caller_id": {
      "type": "string"
    }
  }
}
🟢list_collection(session_token)

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

Input Schema

{
  "type": "object",
  "properties": {
    "session_token": {
      "type": "string",
      "description": "Optional. The SESSION_TOKEN emitted by bootstrap_session. Pass it here when your client cannot set a per-call Authorization: Bearer header."
    }
  }
}
🟢list_content(type, tag)

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

Input Schema

{
  "type": "object",
  "properties": {
    "type": {
      "type": "string"
    },
    "tag": {
      "type": "string"
    }
  }
}
🟢list_personas

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

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢list_provenance(slug)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟢list_skill_groups

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

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢list_skills(category, tag)

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

Input Schema

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string"
    },
    "tag": {
      "type": "string"
    }
  }
}
🟢load_skill_group(name, session_token)

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

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "session_token": {
      "type": "string",
      "description": "Optional. The SESSION_TOKEN emitted by bootstrap_session. Pass it here when your client cannot set a per-call Authorization: Bearer header."
    }
  },
  "required": [
    "name"
  ]
}
🟢mysloodsiewnia_get(doc_slug)

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

Input Schema

{
  "type": "object",
  "properties": {
    "doc_slug": {
      "type": "string"
    }
  },
  "required": [
    "doc_slug"
  ]
}
🟢mysloodsiewnia_list(doc_type, limit, offset)

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

Input Schema

{
  "type": "object",
  "properties": {
    "doc_type": {
      "type": "string"
    },
    "limit": {
      "type": "integer"
    },
    "offset": {
      "type": "integer"
    }
  }
}
🟢mysloodsiewnia_search(query, limit, doc_type, doc_slug)

Full-text search (BM25 over SQLite FTS5) on kapoost's local vault corpus. Requires Authorization: Bearer <edit token or friend token>. Friend tokens see only their scoped doc_types; access:private is invisible. Returns {status, results:[{source, type, body, doc_slug, title, page, citation}], summary}. Vault offline ⇒ {status:offline}.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string"
    },
    "limit": {
      "type": "integer"
    },
    "doc_type": {
      "type": "string"
    },
    "doc_slug": {
      "type": "string"
    }
  },
  "required": [
    "query"
  ]
}
🟢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>.

Input Schema

{
  "type": "object",
  "properties": {}
}
🔴mysloodsiewnia_write(doc_type, title, body, source_path, meta)

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

Input Schema

{
  "type": "object",
  "properties": {
    "doc_type": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "body": {
      "type": "string"
    },
    "source_path": {
      "type": "string"
    },
    "meta": {
      "type": "object"
    }
  },
  "required": [
    "doc_type",
    "title",
    "body"
  ]
}
🟢prepare_narada(context, personas, session_token)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "context": {
      "type": "string"
    },
    "personas": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional. Explicit persona slugs (from list_personas). When present the keyword manifest is not used. Omit for automatic keyword routing."
    },
    "session_token": {
      "type": "string",
      "description": "Optional. The SESSION_TOKEN emitted by bootstrap_session. Pass it here when your client cannot set a per-call Authorization: Bearer header."
    }
  },
  "required": [
    "context"
  ]
}
🟢read_blob(slug, caller_kind, caller_id)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "caller_kind": {
      "type": "string"
    },
    "caller_id": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟢read_collection_item(slug, session_token)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "session_token": {
      "type": "string",
      "description": "Optional. The SESSION_TOKEN emitted by bootstrap_session. Pass it here when your client cannot set a per-call Authorization: Bearer header."
    }
  },
  "required": [
    "slug"
  ]
}
🟢read_content(slug)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟢read_provenance(slug, id)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "id": {
      "type": "string"
    }
  },
  "required": [
    "slug",
    "id"
  ]
}
🟢recall(code, query, limit, session_token)

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

Input Schema

{
  "type": "object",
  "properties": {
    "code": {
      "type": "string"
    },
    "query": {
      "type": "string"
    },
    "limit": {
      "type": "integer"
    },
    "session_token": {
      "type": "string",
      "description": "Optional. The SESSION_TOKEN emitted by bootstrap_session. Pass it here when your client cannot set a per-call Authorization: Bearer header."
    }
  },
  "required": [
    "code"
  ]
}
🟡record_persona_reflection(narada_id, persona_slug, error_context)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "narada_id": {
      "type": "string"
    },
    "persona_slug": {
      "type": "string"
    },
    "error_context": {
      "type": "string"
    }
  },
  "required": [
    "narada_id",
    "persona_slug",
    "error_context"
  ]
}
⚪remember(text, code, from, tags, session_token)

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

Input Schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "from": {
      "type": "string"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "session_token": {
      "type": "string",
      "description": "Optional. The SESSION_TOKEN emitted by bootstrap_session. Pass it here when your client cannot set a per-call Authorization: Bearer header."
    }
  },
  "required": [
    "text",
    "code"
  ]
}
🟢request_access(slug)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟢request_license(slug, intended_use, caller_id)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "intended_use": {
      "type": "string"
    },
    "caller_id": {
      "type": "string"
    }
  },
  "required": [
    "slug",
    "intended_use",
    "caller_id"
  ]
}
🟡run_narada(context, from, personas)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "context": {
      "type": "string"
    },
    "from": {
      "type": "string"
    },
    "personas": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional. Explicit persona slugs (from list_personas) to consult. When present the keyword manifest is not used and these exact personas answer, in this order. Omit for automatic keyword routing."
    }
  },
  "required": [
    "context"
  ]
}
🟢search_content(query, limit)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string"
    },
    "limit": {
      "type": "integer"
    }
  },
  "required": [
    "query"
  ]
}
🟡submit_answer(slug, answer)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "answer": {
      "type": "string"
    }
  },
  "required": [
    "slug",
    "answer"
  ]
}
⚪suggest_skills(files, languages, git_origin)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "files": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "languages": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "git_origin": {
      "type": "string"
    }
  }
}
⚪synthesise_persona_patterns(slug)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟡upsert_skill(slug, category, title, body, tags)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "category": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "body": {
      "type": "string"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "slug",
    "category",
    "title",
    "body"
  ]
}
⚪verify_content(slug)

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

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded43 tools
verifiedversion not recorded43 tools
verifiedversion not recorded42 tools
verifiedversion not recorded42 tools