shinobi-plugin-example
eference Shinobi plugin: exports a project as a Markdown brief via mcp__shinobi__plugin_export_markdown. Fork this to build your own MCP tools on top of Shinobi's read-only ShinobiApi facade.
Links
README
From the repo.
shinobi-plugin-example
Reference Shinobi plugin. Forks of this repo are the recommended starting point for any custom MCP tool you want to wire into Shinobi.
Registers one tool: plugin_export_markdown. Pass a project_id,
get back a single Markdown brief that includes the project header,
subtasks grouped by status, decisions, dead ends, notes, and per-project
context. Useful for handoff docs, status summaries, or pasting into
Slack.
Plugins in this repo
| Plugin | Path | What it shows |
|---|---|---|
shinobi-plugin-example | root (index.mjs) | Minimal read-only plugin — one tool over the read-only ShinobiApi. |
shinobi-plugin-fitness | fitness/ | Stateful reference plugin — 7 tools over the writable registry.state store, in TypeScript with a build + tests. |
Each is its own publishable npm package. For a brand-new plugin the usual pattern is its own repo; the two here live together only because this repo is the shared example/template.
Install
This package follows the auto-discovery naming convention
(shinobi-plugin-*), so Shinobi finds it without any config once it's
in node_modules.
# From npm (after the package is published)
npm install -g shinobi-plugin-example
# Or from this repo (recommended while iterating)
npm install -g github:numbererikson/shinobi-plugin-example
Restart your MCP client and mcp__shinobi__plugin_export_markdown
becomes available.
Verify it loaded:
mcp__shinobi__plugin_hello
The response lists every discovered plugin and the tools it registered.
You should see shinobi-plugin-example with one tool.
Use
From your MCP client:
mcp__shinobi__plugin_export_markdown { "project_id": 1 }
Pipe the returned markdown into a file:
"Export project 1 as Markdown and save it to ./project-1-brief.md"
The agent calls the tool, takes the markdown field, and writes the
file.
How it works
This plugin uses the read-only ShinobiApi facade Shinobi passes to
every plugin's register function. The full available surface is
documented in
docs/plugin-development.md
in the main Shinobi repo. The plugin pulls:
api.getProject(id)— project headerapi.listSubtasks({ projectId })— every task with status + priorityapi.listDecisions({ projectId, limit: 20 })— recent decisionsapi.listDeadEnds({ projectId, limit: 20 })— recent dead endsapi.listNotes({ projectId, limit: 20 })— recent notesapi.getContext(id)— conventions, don't-touch list, deploy notes
…and renders them as one Markdown document.
Plugins are read-only by design. If you need a tool that writes to
Shinobi state, the right pattern is for the tool to return a structured
plan ("here's what I'd write") and have the LLM call a built-in tool
like log_decision or create_task to do the actual write. Built-in
tools have audit logging, schema validation, and the activity timeline
hook; plugin writes would bypass all of that.
Fork it
This repo is intentionally minimal. To build your own plugin:
- Fork or clone this repo.
- Rename in
package.json(must start withshinobi-plugin-for auto-discovery). - Rewrite
index.mjs— keep theexport default function registersignature. - Update
descriptionandkeywordsinpackage.json. npm install -g .to test locally; publish when ready.
The peerDependencies entry pins to @shinobiapps/shinobi >=0.1.3
because the plugin API contract stabilized in that release. Future
breaking changes will be reflected in a peer-dep bump.
License
MIT — see LICENSE.
Collected info
- ★ 0 stars
- Language: TypeScript
- Source updated: 7/3/2026
Config for your environment
Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.
Tool
OS
Config file: ~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"url": "{MCP_ENDPOINT_URL}"
}
}
}Paste into mcpServers in the config file. Restart Cursor after saving.
If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.