Post-itSign in

Post-it

Post-it is a place to write things down, where who can read what is the product rather than a setting on the side of it. You write Markdown in spaces, organise it in folders, and share a page or a whole folder with a person, with a team, or with anyone at all. A page you have not been given is not merely hidden from you: it is indistinguishable from a page that does not exist.

A page is usually Markdown, and can also be an HTML document or a JSON file, either written here or uploaded as it is. JSON is shown as a tree you can fold, with the file itself underneath.

An HTML page is the one thing here that works differently. Its bytes are a file rather than a row, and it carries an address you can send to somebody with no account at all — which is what a mockup is for. The document runs in a frame of its own, with no reach into Post-it, and anybody holding the link can open it. It is the only thing here readable without being given, and the page says so next to the link.

The other half is that you can connect it to Claude, so the things you have written are available in conversation without copying them anywhere. That is what the rest of this page is about.

Connecting Post-it to Claude

1. Make a token

Sign in, then go to Your spaces and follow Connect Post-it to Claude, or go straight to /settings/mcp. Give the token a name you will recognise in six months, like the machine it is going on.

The token is shown once and never again. Only a hash of it is stored, so nobody, including us, can recover it. If you lose it, revoke it and make another; that takes ten seconds and is the right instinct. Revoking takes effect on the very next request.

By default a token reaches everything you can reach. You can pin one to a single space at creation, which is worth doing for a machine you trust less than your own.

2. Point Claude at it

Your endpoint is:

MCP endpoint
https://post.staging.maqsoodlabs.com/api/mcp

Claude Code. Run this in a terminal, or put the JSON in .mcp.json at the root of a project.

Claude Code, command line
claude mcp add --transport http postit https://post.staging.maqsoodlabs.com/api/mcp \
  --header "Authorization: Bearer post_your_token_here"
Claude Code, .mcp.json
{
  "mcpServers": {
    "postit": {
      "type": "http",
      "url": "https://post.staging.maqsoodlabs.com/api/mcp",
      "headers": {
        "Authorization": "Bearer post_your_token_here"
      }
    }
  }
}

The Claude apps, desktop and web. Settings, then Connectors, then Add custom connector. That dialog takes a URL and nothing else, so for these the token goes in the URL itself: https://post.staging.maqsoodlabs.com/api/mcp/your-token, which the token screen gives you ready to paste.

That form is deliberately the weaker one. A token in a URL is in every HTTP log that records the path, in whatever the client stores for the connection, and anywhere the URL is pasted; a token in a header is in none of those. Use it only where a header is not on offer, and prefer a token pinned to a single space so that a leak costs one space rather than an account.

The API. Three things are needed and it is easy to give two: the beta header, the server in mcp_servers, and a matching mcp_toolset entry in tools. Leaving the toolset out does not quietly ignore the server, it makes the request invalid.

Anthropic API
curl https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: mcp-client-2025-11-20" \
  -d '{
  "model": "claude-opus-5",
  "max_tokens": 2048,
  "messages": [
    {
      "role": "user",
      "content": "What is on my todo list?"
    }
  ],
  "mcp_servers": [
    {
      "type": "url",
      "url": "https://post.staging.maqsoodlabs.com/api/mcp",
      "name": "postit",
      "authorization_token": "post_your_token_here"
    }
  ],
  "tools": [
    {
      "type": "mcp_toolset",
      "mcp_server_name": "postit"
    }
  ]
}'

What a connected Claude can and cannot reach

A token acts as you. Every request it makes is answered by the same rules that answer your requests in the browser, so a connected Claude sees exactly what you see and never more. Share a folder with yourself tomorrow and it appears; have it revoked and it disappears, with no cache to go stale in between.

It can:

  • list_spaces, list_tree to see what is in one, search within it, and read_page by path or id
  • list_skills and get_skill, so it can find and follow the skills you have written
  • create_folder and create_page, so it can build structure and not just a flat list, and update_page guarded by a version number, so it cannot overwrite an edit you made while it was thinking
  • attach_file, to bring in a file it already has: Markdown, an HTML document or a JSON file, named after the file and typed from its extension, with append_to_page for one too large to pass in a single call
  • ask_for_review, approve_page and clear_review, for documents whose author wants one. Approving through a token is you approving, so ask for it deliberately rather than leaving it to a tidy-up
  • list_backlinks, to see what points at a page
  • list_comments and add_comment, to read and join the conversation on a page

It cannot:

  • delete or move anything
  • change who can see anything
  • reach a page nobody has given you, whatever it is asked to do

That list is short on purpose. A token is a long-lived credential sitting on the internet, and one that can only add is a far smaller problem to have leaked than one that can remove. The dangerous things are still available, deliberately, in the browser.

Articles and skills

Every page in Post-it is an article or a skill. An article is prose: notes, a decision, a write-up. A skill is a Markdown file written as instructions for Claude to follow, in the same shape Claude uses elsewhere, which means Post-it doubles as a place to keep them.

The distinction earns its keep the moment you ask for your skills:

  • list_skills returns your skills and nothing else, so "what can you do for me here" does not also return every meeting note.
  • get_skill returns the instructions with the metadata stripped, ready to follow.

A skill worth having:

  • Has a name and a description in its frontmatter. The description is what a client reads to decide whether the skill is relevant, so it should say when to use it, not what it is called.
  • Says what to do, not what the topic is. "Read the runbook before starting, every time" beats "runbooks are important".
  • Includes a worked example. A skill nobody can picture using does not get used.
  • Names the failure it exists to prevent. That is usually the reason somebody wrote it, and it is the part that makes the instruction stick.

Post-it will not stop you saving a skill with no description. It will say so and save it anyway: losing what you wrote over a formatting detail is a much worse outcome than an incomplete skill.

Skillsets, and installing them anywhere

A space whose contents are skills can be marked a skillset, from the Skillset button in its header. The mark changes nothing about who can read anything. A skillset is a space: the same members, the same teams, the same sharing, and a page nobody gave you is still a page you cannot see. What it adds is that the skills in it can be fetched as files.

The format is the one the wider ecosystem settled on: a folder per skill, each holding a SKILL.md whose frontmatter carries a name and a description. Post-it has stored exactly that since skills existed. So the tools that install skills can install from here:

Install a whole skillset
npx skills add https://post.staging.maqsoodlabs.com/k/YOUR_TOKEN/your-skillset.tar.gz

The token in that address is an ordinary MCP token, and it is you: it reaches exactly the skills its owner can reach and no more. Two people running the same command get different skills, because they were given different things, and somebody who was given nothing gets the same 404 as if the skillset did not exist. Nothing in the serving code knows the difference between them — it is the same rule that decides what you see in a browser.

Which is also the warning. A secret in an address is in every log that records addresses, in whatever the installer writes to disk, and in any window the URL is later pasted into. Pin the token to the one skillset when you make it, so a leaked address costs that skillset rather than your account.

The folder each skill installs into is named from its frontmatter rather than from the page, because the standard asks for a skill and its folder to agree. A page called "Invoicing (v2, final)" whose frontmatter says name: monthly-invoicing installs as monthly-invoicing/. One skill can be fetched on its own at /k/YOUR_TOKEN/your-skillset/monthly-invoicing/SKILL.md, and /k/YOUR_TOKEN on its own lists what that token can reach.

What a skillset does not carry yet is the optional scripts/ folder that the format allows. Post-it has no file type that is meant to be executed, and adding one is not a small decision. Skills here are instructions and references.

Six skills to start with

Copy any of these into a space, mark it as a skill, and it is available to your Claude immediately. They are meant to be edited: the house style one in particular is worth nothing until it describes how you actually write.

Chat Context

File what a conversation decided into Post-it, and pick it back up in a later session.

Chat Context

Todo List

Keep todos as a checklist in a page. Claude adds items, reads what is outstanding, and ticks things off.

Todo List

Decision Log

Record a decision with its alternatives and what would make you revisit it, then answer 'why do we do it this way' from the record.

Decision Log

House Style

Teach Claude how you write, so drafts come back sounding like you rather than like a press release.

House Style

Onboarding a Colleague

Share a folder with somebody and their own Claude picks up the project's context, through their own token.

Onboarding a Colleague

Runbooks

Operational procedures written once and followed consistently, read live rather than from a stale copy.

Runbooks

Wave Design

For Claude Design: start here. Says which Wave skill comes next, from DESIGN.md to review.

Wave Design

Wave Brief

For Claude Design: interview the designer and write the project's DESIGN.md, the defaults every screen inherits.

Wave Brief

Wave Design System

For Claude Design: build the project's tokens and approved component specimens from DESIGN.md.

Wave Design System

Wave Feature

For Claude Design: write a feature's FEATURE.md from the prompt, then generate its screens with Wave attributes in place.

Wave Feature

Wave Review

For Claude Design: ask only the questions left, check, upload, make the prototype and handle review.

Wave Review

Wave Figma

For Claude Code: start here when the design is in Figma. Runs the Figma flow in three stages; the engineer answers questions, the designer fixes Figma and approves.

Wave Figma

Wave Figma Brief

Figma flow, stage 1: DESIGN.md from the Figma file, asking only what Figma cannot say.

Wave Figma Brief

Wave Figma Design System

Figma flow, stage 2: tokens and specimens from Figma, or a readiness report for the designer when Wave cannot convert the file exactly.

Wave Figma Design System

Wave Figma Feature

Figma flow, stage 3: screens, FEATURE.md interview, review and prototype, or a readiness report when the screens cannot be converted exactly.

Wave Figma Feature

Wave Build

For Claude Code: build an approved Wave flow from its handover, with get_handover and get_handover_screen.

Wave Build

Two questions people ask

If I publish a page, does Claude see the comments on it? No. Publishing a page puts the document on the internet; the conversation about it stays behind a login. Comments tend to be candid in a way the document is not, and one toggle should not put them in public.

Can somebody work out that a page exists by searching for a word in it? No. Search runs under your permissions, so a word that appears only in a page you cannot read returns nothing at all, rather than a result with the content hidden. The same is true of links: a link to a page you may not read renders identically to a link to a page that does not exist.