hcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hcp-serverread my context files and summarize who I am"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Personal MCP server
A public door where other people's agents read your context and leave you a message. No authentication, and none coming — a read layer that anyone can read is the whole point of a door.
This repo is two things at once. It is a reference: the same code runs
postnikov.ai/mcp, answering strangers' agents since
August 2026. And it is a template: nothing personal lives in the code, all of
it lives in context/, which never enters git. Fork it, drop your own files in,
run it — you have a server built to the
HCP shape.
Why you'd want one at all — the idea, the live example and what not to build: humancontext.pro.
Five minutes
# 1. Your own copy — "Use this template" on GitHub, or locally:
git clone https://github.com/postnikov/hcp-server.git my-mcp
cd my-mcp && rm -rf .git && git init
npm install
# 2. Your personal layer
cp -r context.example context
$EDITOR context/who.md # one file is enough to start
$EDITOR context/config.json # your name, your domain, your caps
# 3. Check it here
npm test
npm start # http://localhost:3000/mcp
# 4. Point an agent at it
claude mcp add --transport http me http://localhost:3000/mcpYou don't have to write context/ by hand. The prompt
prompts/generate-my-hcp.md in
hcp-protocol drafts these files
from material you already published — your CV, your posts, project READMEs, talk
transcripts — and asks you questions only where the material ran out. Details in
context.example/README.md.
Related MCP server: ohmyself
Three tiers: read, ask, knock
The default file set plus ask gives you seven tools, and add a file and you get
an eighth. The names don't matter much; the split into three tiers does.
Tier | Cost | What it is |
file tools | free · instant · no model in the path | Return a markdown file from your context, unchanged. No LLM, no latency, nothing to inject a prompt into. This tier does most of the work — build it first and you may never need the rest |
| one API call · hard daily cap | For the question your files don't answer head-on. A model answers strictly from the same files, under a daily ceiling so an experiment can't become a bill. Off by default: the only tool that costs money |
| the one write · human in the loop | A note lands in |
Access is uniform — every tier is open to every agent, with no key and no
account. What separates the tiers is what each one costs you and how far it
reaches: reading is free and touches nothing, ask spends your money against a
budget you set, leave_message is the only path that puts something in front of
a human. Everything an agent can reach is something you published on purpose;
the layer you keep private is the one you never put in context/.
The server serves what you have
Tools are declared by file presence. No speaking.md, no get_speaking in
tools/list — an agent never gets an empty answer from a tool you don't have.
Drop in context/reading.md and get_reading appears. No code to touch.
File in | Tool |
|
|
|
|
|
|
|
|
|
|
any |
|
The floor is one file. who.md and nothing else gives you a working server
with two tools (get_profile, leave_message). Zero files and the server
refuses to start and tells you why: an empty server is worse than no server.
Every call is written to data/journal.jsonl. That log is the instrument — it's
how you find out whether anyone's agent actually comes knocking, and what they
came to ask.
Your personal layer
context/ ← yours, never enters git (.gitignore)
config.json name, domain, caps, description overrides
*.md context files; a YAML header names the tool
deploy.env VPS address and domain — read only by deploy.sh
context.example/ ← the same thing as a template, committed
.env ← secrets, on the server; sample in .env.exampleA context file may carry a header. It never reaches the agent:
---
tool: get_speaking
title: Speaking
for_agent: >
What is inside and when it's worth calling. The agent reads this BEFORE
it calls the tool.
---
# Speaking — Your NameNo header, and the convention from config.json → context.groups applies, then
get_<filename>. No description, and an honest one-liner is generated instead
of an invented one.
Everything the server says about you comes out of context/: there is not one
personal word in src/. A test checks that, so it's a fact and not a promise.
config.json
The file is optional — without it the server still runs, it just talks about
"the owner of this server". Full annotated version: context.example/_config.md.
Key | What it sets |
|
|
|
|
| the file → tool map, and the order tools appear in |
| overrides the descriptions of |
|
|
| per-IP buckets: calls per minute, |
| whether this process serves its own |
Environment
All optional: with no variables at all the server serves files and takes a
message. Commented sample in .env.example.
Variable | What it gives you |
| turns on |
| the key for |
| model and daily ceilings |
| Telegram push when a message arrives |
| the same by email, through Resend's HTTP API |
| serve your own |
| the public address of |
| where to listen, where data goes, where your personal layer lives |
Secrets travel by environment only. They are not in the code, not in the config files, and not in git.
Limits and money
What | Default | Where it lives |
All calls | 60/min per IP | process memory |
| 10/day per IP | process memory |
| 5/day per IP | process memory |
| 20/day, everyone combined |
|
| 150,000/day, everyone combined |
|
The daily ask ceilings are money-safety. Per-IP limits are not enough, because
IP addresses are free for an agent and your API key is not. Hit either ceiling
and the tool refuses without touching the API, and lists the free file tools
instead. Resets at 00:00 UTC. Numbers live in context/config.json → ask.
Discovery
With discovery.enabled the server serves two files itself:
/.well-known/mcp/server-card.json— the MCP registry schema (2025-09-29): reverse-DNS name, description under 100 characters,remotes[].type: streamable-http;/llms.txt— the same truth for an agent that reads text instead of JSON.
Both are assembled from your config and the real tool list, so there is
nothing there to promise a capability you don't have. If your site already
serves those files on the same domain, set SERVE_DISCOVERY=0. Two truths are
worse than one.
Protocol: two eras, one endpoint
Built on SDK v2 (@modelcontextprotocol/server +
@modelcontextprotocol/node). createMcpHandler serves both protocol eras on
the same /mcp, from a single server factory:
modern — 2026-07-28: no
initialize; version and client ride in a per-request envelope (_meta), method and tool name are mirrored in theMcp-Method/Mcp-Nameheaders (SEP-2243), andserver/discoverreturns the overview. The response is JSON.legacy — 2025-era: the ordinary
initialize, version negotiated from the client's request (the SDK's ceiling is 2025-11-25). The response is an SSE frame, not JSON — that's what the stateless path looks like in SDK v2. It is not a change of contract: a 200 only ever went to a client that declaredAccept: text/event-stream.
Use a current SDK when you fork this. Modern clients do not negotiate their way down to legacy-era servers on their own, and an old server is a door today's agents can't open.
Deploy to your own VPS
cp context.example/deploy.env context/deploy.env # server, domain, names
$EDITOR context/deploy.env
./deploy.shdeploy.sh runs the tests, previews what would be deleted on production (a gate
in front of --delete), mirrors the working tree, loads context/deploy.env
into the environment and rebuilds the container, then smoke-tests
MCP_PUBLIC_URL. .env and data/ never cross the border: secrets and the
journal live on production only.
docker-compose.yml assumes traefik — domain, router priority and certresolver
all come from deploy.env. The router priority must be higher than that of
the site on the same domain, or requests to /mcp go to the site and the agent
gets an HTML 404 instead of JSON-RPC.
No traefik? Drop the labels block, publish the port and put anything that
speaks TLS in front.
Check a running server
# the tool list
curl -s localhost:3000/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | jq -r '.result.tools[].name'
# a file tool
curl -s localhost:3000/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_profile","arguments":{}}}' \
| jq -r '.result.content[0].text'A hand-written curl in the modern era, with no Mcp-Method / Mcp-Name, gets
-32020 back. That is the correct answer, not a breakage. The real check is an
official MCP client.
Rules worth keeping
Public facts only. Everything in
context/goes to any agent, with no authorization. Nothing about family, health, finances or deal sizes.No prices at all — "pricing on request, use
leave_message". Otherwise your rate card ends up in someone else's cache and outlives every correction you make.Context is read at process start. Edit a file, restart the server.
No tool executes the content of its arguments: the question in
askis sent declared as data, and aleave_messagegoes to a file and to a notification with no markup. Don't break that.Read every version with your own eyes before it ships. An agent that assembles your pack from your notes will happily carry something private across.
Layout
context.example/ template for the personal layer (context/ is yours, not in git)
src/config.js config: defaults, context/config.json, env
src/context.js your files → sections and the tool list
src/mcp.js the protocol: tools, schemas, journal, mounting /mcp
src/lib.js state on disk, budget cap, validation, Anthropic + notifications
src/discovery.js server-card.json and llms.txt from the config
src/server.js express, client IP behind a proxy, rate-limit buckets, startup
test.js node:test on fixtures, everything outbound mocked
data/ journal.jsonl, inbox.jsonl, budget.json (not in git)Two dependencies: express and the MCP SDK. No ORM, no database, no SMTP
client — mail goes out over plain fetch. Keep it that way.
License
MIT — take it, change it, run it, sell services on top of it.
Attribution belongs in the code (the copyright line in LICENSE), not on your
site. What's in your context/ is yours either way: the code never touches it.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Related MCP Servers
- AlicenseBqualityDmaintenanceA simple server implementing the Model Context Protocol (MCP) that exposes personal tools like note-taking for compatible MCP clients or agents.22,013MIT
- AlicenseNot gradedqualityBmaintenanceExposes a personal markdown-based second brain (Obsidian-style) as an MCP server, enabling agents to search, read, and write notes with privacy controls.MIT
- FlicenseNot gradedqualityCmaintenanceA local MCP server that semantically searches Markdown context files and extension context links, providing tools for context_search, context_read, and context_status.
- AlicenseNot gradedqualityBmaintenanceProvides a file-first personal memory layer for AI agents, enabling them to store and retrieve memories as markdown files with an SQLite index. The MCP server offers read-only search by default, with optional write tools for manual memory addition and conflict resolution.11MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/postnikov/hcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server