Server definition
- Hash
- sha256:139272ae93e7558505a87b3fdb1b8c44890be964f7f636cd7826e1b8d1a10052
- What it is
- What a remote MCP server returned when asked what it offers: 17 tools
The blob, as servednamed by its sha256
{
"instructions": "SHPBL: Harvest Reusable Software Capability. Audit a GitHub repository the caller has the right to read — a public repository that carries a proper open-source license, the caller's own repository, or a private repository the caller has access to — write the fix, harvest what it can do, and open a pull request with the result. Seventeen tools, in the order a run uses them. FIRST CONTACT: the very first call of a new conversation is `welcome` (free, unmetered, no key) — it returns the greeting, the tool menu, the sentences a person can say out loud, the support address and the link to the user's manual at https://shpbl.com/manual. Read it back to the person warmly and briefly, then ask what they would like to point it at. Never skip it and never invent your own orientation in its place. ONE SHAPE FOR EVERYONE: every caller is diagnosed at full depth — `evaluate_repo` always returns the same sections: 1) report, 2) capabilities found (name, signature, file and line, stated contract, dependencies), 3) benchmark against SHPBL's anonymous corpus of audited repositories, 4) the ten meta-capability scan, and, for a licensed caller only, 5) the library rows that already cover what the repository does and 6) the caller's own library matches when supplied. The diagnosis is never shortened by tier. THE COMPOSITION BOUNDARY: a free run stops before either library is searched. The SHPBL library rows, candidates, parent lineage and proposed architecture are absent from a free result because they were never computed — they are not hidden for you to infer, name, guess or reconstruct, and handing such suggestions to another agent is exactly what the boundary exists to prevent. Say the stop in the words the tool gives you, then invite the person once: composing and creating new capability from what was found is the Practitioner step, $39 a month with a 7-day free trial, cancellable in Stripe at any time — https://shpbl.com/mcp-access#subscribe. The ten meta-capabilities are SHPBL's own run engines, held privately in the SHPBL MCP tree: Creative Forge, World-First Cognitive, Deep Cognition Nexus, Knowledge Nexus, Memory Intelligence Fabric, Intelligence Pipeline, Quality Fabric, Resilience Shield, Security Fortress and Resource Governor. They govern how a run is conducted — attention, memory, reporting, citation, resilience, hands-off boundaries and spend. Every method path states the rules they impose and holds them for the whole run. They are never a checklist applied to the caller's repository, never harvested and never cited as prior art. A third class exists and must never be confused with either of the other two. The twenty-four self-application engines (`CML-SELF-001` … `CML-SELF-024`, held privately in `private/self-application`; eighteen have live adapters, the rest are local-proof or held) govern how the library itself operates — which of its own contained software is actually executing, what depends on what, whether a capability contract may evolve, how canon is admitted. They act on the CML, never on the caller's repository. They are counted in no published total, they are refused by `library_search` in every scope and by ID, and they are never citable as prior art or harvestable into a caller's library — there is no admission path for them, because substrate is not inventory. Where one is live in this server it is reported by `selfcheck_mcp`; where it is not, the reason is stated, and a local proof is never described as production behaviour. If a caller asks for one of these IDs, say what the class is and point them at the catalog or the vault for the capability they actually need. THE PROCEDURE IS LAW, NOT ADVICE. Every step a tool returns is followed exactly as written: no reordering, no merging, no added steps, no substituting an approach you judge better, and no optimising. One server step per turn — call the tool, do the step it returned, report one line to the person, then call the next; never two steps in one turn and never the whole run in one turn. Never infer, extrapolate or fill a gap: if the supplied material does not answer it, write \"not present\" and move on, and never claim to have read something you were not handed. There is exactly one legal deviation — the step as written would break a stated guideline (a hands-off path, a licence boundary, an authority or safety rule, or an instruction from the person). When that happens, stop, say which step and which guideline collide and what the options are, wait for the person to choose, and record the deviation in the final report. A silent deviation invalidates the run. Human in the loop: `run_gauntlet` refuses `step: 2` and beyond unless you return both the `ledger_digest` you folded and the `fold_token` the previous step handed you — the token is signed by this server and carries the hash of that ledger, so a skipped step or a rewritten ledger is refused rather than believed. The run also pauses every 3 harvest steps until you have reported to the person, asked whether to continue, and passed `continue_ack: \"continue\"`. Ask before anything that costs or changes something. These are server-enforced, not preferences. What a key changes is FULL EXECUTION AND RETENTION: with no key the repository evaluation is complete and belongs to the caller, but the run stops at the composition boundary and nothing is saved — no full gauntlet, library search, candidates, Build Intent, foundry, pull request, export or recorded run. A Practitioner key at $39 a month opens `run_gauntlet`: both libraries are searched, new capability is composed and verified, and the result can be written back into the caller's own repository. Ownership: whatever a run produces is the caller's, outright. Nothing is submitted to, or absorbed by, SHPBL's library — the library and the method are ours, the run is theirs. There is no contribution loop; never offer one. Sources: only read public repos with a proper open-source license, the caller's own repos, or private repos the caller has access to. Never guess a repository name: if the person has not given you an exact `owner/repo`, call `list_repos` first. THE HARVEST LANE IS THE POINT: `compose_capability` fuses what the caller's repository can already do with owned SHPBL primitive capabilities — DREAM, EVOLUTION, MEMORY, DEFENSE, BRAIN and the rest of the canonical forty, plus the S-Tier artifacts — and returns Capability Grants: the host evidence each one mounts on, the exact capability bodies bound in with their class (PURE, SEAMED, PORTED) and declared ports, a seed module carrying those harvested bodies, and the wiring, verification and limits. A grant is not finished application code and must never be described as one: the caller's own agent writes the repository-specific code. Repair is plumbing; harvest is the product. `compose_capability` requires Practitioner because it correlates the owned library; a free call still returns the affordances read and the offerable census, then stops at the boundary. The free evaluation tools are `evaluate_repo`, `fix_repo` and `harvest_repo`; each is separately useful, but together they must never be described as the full gauntlet. `run_gauntlet` is Practitioner-only and conducts the full governed sequence from survey through library comparison, composition, verification, report and delivery. HANDS OFF, ALWAYS: never edit, delete, rename or move a file that a platform, package manager or another coding agent owns — `.env` and environment files, every lockfile, generated code (`*.gen.ts`, `__generated__/`), agent instruction files (`AGENTS.md`, `CLAUDE.md`, `.cursor*`, `.claude/`, `.lovable/`, `lovable.toml`), backend wiring and migration history (`supabase/config.toml`, `supabase/migrations/`, generated clients and types), build/CI/deploy config (`.github/workflows/`, `vercel.json`, `netlify.toml`, `wrangler.toml`, `Dockerfile`), `.git/`, vendored or built output, and any credential file. Read them and write about them; never change them. `write_to_repo` refuses those paths outright for every tier, with no override. THE GATE BETWEEN FINDING AND BUILDING: every COMPOSE, SPECIALIZE and CREATE must be registered with `build_intent` before source is written. This server never calls a model — the reasoning is always the caller's. The method is free and separate through `method_protocol`. `run_contract` is free and is the canonical authority for the twelve steps: read it rather than inferring a step, and run its gate rather than declaring a run finished — it is the same implementation as the offline `tools/run-gate.mjs`, so connected and offline runs cannot disagree. `library_index` is free; `library_document`, `library_search`, `compose_capability`, `run_gauntlet` and `write_to_repo` require Practitioner. The $499 Complete Master Library is a separate tangible product and never a tool unlock. Metered Practitioner calls are counted against the monthly allowance; refused calls are not charged. Keys: https://shpbl.com/mcp-access This is the key-only endpoint: carry `Authorization: Bearer shpbl_mcp_…` as a request header, or pass `key` on each gated call. Clients that support OAuth should use https://shpbl.com/mcp instead and bind their key once at https://shpbl.com/account.",
"tools": [
{
"description": "The gate between discovery and creation, and the human checkpoint in front of it. Register one Build Intent — what you found in the host, what SHPBL already possesses, what new software becomes possible, why neither parent does it alone, and the tests that would prove it — and this returns the mechanical verdict: the invariants it passed, whether it rests on SHPBL's licensed reusable capability, whether this caller may execute the foundry, the terminal state to report, and where an authorised artifact may come to rest. THE CHECKPOINT BLOCKS: without `human_decision` carrying an attributed decision from the person, this returns the proposal in the words to say to them and nothing else — no verdict, no read, no record — and you end your turn and wait. No answer yet is NOT_YET_ASKED, never DECLINED. A decision attributed to you, to a model, to a policy or to a default is refused where the server can recognise it as such; any other name is recorded and attributed, not verified, and the authorization says which — `account` when the name matches the key's account holder, `attested` otherwise. DECLINED and NEEDS_EXPLANATION are successful outcomes: record them, build the approved siblings, and do not report a declined proposal as a failed step. Free to call at every level. Every COMPOSE, SPECIALIZE and CREATE must pass through this before any source is written; never assume authority and never write a refused artifact yourself.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"cml_license": {
"description": "The licence key from a purchased Complete Master Library. Perpetual rights to that release count as execution authority on their own — no subscription needed.",
"maxLength": 80,
"minLength": 8,
"type": "string"
},
"github_token": {
"description": "Optional GitHub token (Contents: read) so the gate can read the host tree and prove the cited paths exist. Not needed if you pass `host_source_manifest`.",
"maxLength": 300,
"minLength": 8,
"type": "string"
},
"governor_key": {
"description": "Governor authority. Only a Governor-resolved call may stage an artifact for SHPBL's global corpus.",
"maxLength": 200,
"minLength": 8,
"type": "string"
},
"host_source_manifest": {
"anyOf": [
{
"maxLength": 4000000,
"minLength": 2,
"type": "string"
},
{
"additionalProperties": {},
"type": "object"
}
],
"description": "The `HOST-SOURCE-MANIFEST.json` from `pin_source` or `tools/source-manifest.mjs`, as JSON text or an object. Offline runs must send this: the gate recomputes its digest and resolves every cited path against its entries. An edited or invented digest is refused."
},
"human_decision": {
"additionalProperties": false,
"description": "The person's decision on this proposal. Step 9 is a blocking checkpoint: without an attributed human decision this tool returns the words to say and nothing else, and you end your turn there. Do not send a decision the person did not make.",
"properties": {
"decided_by": {
"description": "The person who made this decision, as they identify themselves. An agent, a model, a policy or a default is not a person and is refused.",
"maxLength": 120,
"type": "string"
},
"decision": {
"description": "Exactly one of APPROVED, DECLINED, NEEDS_EXPLANATION, NOT_YET_ASKED or HUMAN_APPROVAL_DELEGATED. Use NOT_YET_ASKED while you have not put the proposal to the person — never DECLINED, which is their answer, not the absence of one.",
"maxLength": 40,
"minLength": 3,
"type": "string"
},
"delegation_scope": {
"description": "For HUMAN_APPROVAL_DELEGATED only: the authority the named person delegated for this run. Delegation without a scope is refused.",
"maxLength": 600,
"type": "string"
},
"reason": {
"description": "What they said, where they gave a reason. Recorded verbatim in BUILD-APPROVAL.json.",
"maxLength": 2000,
"type": "string"
}
},
"required": [
"decision"
],
"type": "object"
},
"intent": {
"additionalProperties": false,
"description": "The Build Intent record; every field it asks for is part of the evidence, and each field carries its own description in this schema. Required: `build_intent_id`, `proposed_artifact_id`, `proposed_name`, `display_name`, `what_it_gives_you`, `why_this_repo`, `proposed_type`, `host_repository`, `host_source_paths`, `host_behavior`, `host_problem`, `new_behavior`, `novelty_statement`, `planned_interface`. `display_name`, `what_it_gives_you` and `why_this_repo` are quality gates, not presentation: if you cannot name the software and say what new ability it gives this repository and why this repository, the proposal is refused. Tests are mandatory in effect: at least one entry across `planned_unit_tests`, `planned_behavior_tests` and `planned_integration_tests` (the aliases `planned_tests`, `unit_tests`, `behavior_tests` and `integration_tests` are folded into those three). Every path in `host_source_paths` is resolved against the real tree before anything is authorised — a path that is not there refuses the intent.",
"properties": {
"behavior_tests": {
"description": "Alias for `planned_behavior_tests`.",
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"behaviour_tests": {
"description": "Alias for `planned_behavior_tests`.",
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"build_intent_id": {
"maxLength": 120,
"minLength": 3,
"type": "string"
},
"capability_contract": {
"additionalProperties": false,
"properties": {
"approval_id": {
"default": "",
"maxLength": 160,
"type": "string"
},
"approved_by": {
"default": "",
"maxLength": 160,
"type": "string"
},
"artifact_id": {
"maxLength": 160,
"minLength": 3,
"type": "string"
},
"behavioral_promise": {
"description": "The whole promise, complete. If the promise names six lifecycle stages, all six are in scope for green.",
"maxLength": 4000,
"minLength": 40,
"type": "string"
},
"capability_name": {
"description": "What a person calls it.",
"maxLength": 160,
"minLength": 3,
"type": "string"
},
"claims": {
"items": {
"additionalProperties": false,
"properties": {
"claim_id": {
"maxLength": 120,
"minLength": 2,
"type": "string"
},
"host_evidence": {
"default": [],
"items": {
"maxLength": 400,
"minLength": 1,
"type": "string"
},
"maxItems": 60,
"type": "array"
},
"kinds": {
"items": {
"enum": [
"happy-path",
"failure-path",
"boundary",
"lifecycle",
"provenance",
"integration"
],
"type": "string"
},
"maxItems": 6,
"minItems": 1,
"type": "array"
},
"lifecycle_stage": {
"default": "",
"maxLength": 120,
"type": "string"
},
"observable_acceptance": {
"description": "How anyone else would tell whether this claim holds. Not 'it works' — the observation that decides it.",
"maxLength": 2000,
"minLength": 10,
"type": "string"
},
"owned_capabilities": {
"default": [],
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 60,
"type": "array"
},
"requirement": {
"default": "required",
"description": "Optional claims may remain incomplete without blocking green — but only if they were marked optional before the build began.",
"enum": [
"required",
"optional"
],
"type": "string"
},
"statement": {
"description": "What the capability does, stated so it can be observed.",
"maxLength": 2000,
"minLength": 10,
"type": "string"
}
},
"required": [
"claim_id",
"statement",
"kinds",
"observable_acceptance"
],
"type": "object"
},
"maxItems": 200,
"minItems": 1,
"type": "array"
},
"contract_version": {
"const": "SHPBL-CAPABILITY-CONTRACT/1.0.0",
"default": "SHPBL-CAPABILITY-CONTRACT/1.0.0",
"type": "string"
},
"failure_behavior": {
"description": "What it does when it cannot do what it promised. Silence is not failure behaviour.",
"maxLength": 4000,
"minLength": 10,
"type": "string"
},
"host_behaviors": {
"items": {
"additionalProperties": false,
"properties": {
"behavior": {
"description": "What the host repository already does, in behavioural terms.",
"maxLength": 2000,
"minLength": 10,
"type": "string"
},
"must_preserve": {
"default": "",
"description": "The mechanics of this host behaviour the artifact must actually reconstruct, not merely reference.",
"maxLength": 2000,
"type": "string"
},
"source_lines": {
"default": [],
"items": {
"minimum": 1,
"type": "integer"
},
"maxItems": 60,
"type": "array"
},
"source_paths": {
"description": "The host files this behaviour was read from. A behaviour with no cited path is prose, not evidence.",
"items": {
"maxLength": 400,
"minLength": 1,
"type": "string"
},
"maxItems": 60,
"minItems": 1,
"type": "array"
},
"source_symbols": {
"default": [],
"description": "The functions, classes or exports inside those files, where you can name them.",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 60,
"type": "array"
}
},
"required": [
"behavior",
"source_paths"
],
"type": "object"
},
"maxItems": 60,
"minItems": 1,
"type": "array"
},
"host_repository": {
"maxLength": 300,
"minLength": 3,
"type": "string"
},
"inputs": {
"items": {
"maxLength": 400,
"minLength": 1,
"type": "string"
},
"maxItems": 80,
"minItems": 1,
"type": "array"
},
"lifecycle_stages": {
"default": [],
"items": {
"additionalProperties": false,
"properties": {
"entered_from": {
"default": "",
"maxLength": 120,
"type": "string"
},
"stage": {
"maxLength": 120,
"minLength": 2,
"type": "string"
},
"what_happens": {
"maxLength": 1000,
"minLength": 5,
"type": "string"
}
},
"required": [
"stage",
"what_happens"
],
"type": "object"
},
"maxItems": 40,
"type": "array"
},
"optional_enhancements": {
"default": [],
"description": "Declared before the build. An enhancement invented afterwards to explain a gap is not optional, it is missing.",
"items": {
"maxLength": 600,
"minLength": 3,
"type": "string"
},
"maxItems": 60,
"type": "array"
},
"outputs": {
"items": {
"maxLength": 400,
"minLength": 1,
"type": "string"
},
"maxItems": 80,
"minItems": 1,
"type": "array"
},
"owned_capabilities": {
"items": {
"additionalProperties": false,
"properties": {
"capability_id": {
"maxLength": 200,
"minLength": 2,
"type": "string"
},
"primitive": {
"default": "",
"maxLength": 80,
"type": "string"
},
"role": {
"default": "support",
"enum": [
"lead",
"support"
],
"type": "string"
},
"unit_class": {
"default": "UNKNOWN",
"enum": [
"PURE",
"SEAMED",
"PORTED",
"UNKNOWN"
],
"type": "string"
},
"what_it_contributes": {
"default": "",
"maxLength": 2000,
"type": "string"
}
},
"required": [
"capability_id"
],
"type": "object"
},
"maxItems": 60,
"minItems": 1,
"type": "array"
},
"provenance_behavior": {
"description": "What lineage the artifact itself records at runtime, and what it can answer about where it came from.",
"maxLength": 4000,
"minLength": 10,
"type": "string"
},
"seams": {
"default": [],
"items": {
"additionalProperties": false,
"properties": {
"kind": {
"enum": [
"state",
"io",
"model",
"randomness",
"network",
"filesystem",
"persistence",
"time",
"concurrency"
],
"type": "string"
},
"port": {
"default": "",
"maxLength": 200,
"type": "string"
},
"test_strategy": {
"default": "recorded",
"enum": [
"real",
"recorded",
"injected-fake"
],
"type": "string"
},
"what": {
"maxLength": 1000,
"minLength": 5,
"type": "string"
}
},
"required": [
"kind",
"what"
],
"type": "object"
},
"maxItems": 40,
"type": "array"
}
},
"required": [
"artifact_id",
"capability_name",
"behavioral_promise",
"host_repository",
"host_behaviors",
"owned_capabilities",
"inputs",
"outputs",
"failure_behavior",
"provenance_behavior",
"claims"
],
"type": "object"
},
"claim_ceiling": {
"default": "",
"maxLength": 600,
"type": "string"
},
"cml_parent_ids": {
"default": [],
"items": {
"maxLength": 120,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"cml_parent_paths": {
"default": [],
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"composite_parent_ids": {
"default": [],
"items": {
"maxLength": 120,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"confidence": {
"default": "medium",
"enum": [
"high",
"medium",
"low"
],
"type": "string"
},
"dependencies": {
"default": [],
"items": {
"maxLength": 200,
"type": "string"
},
"maxItems": 60,
"type": "array"
},
"display_name": {
"maxLength": 120,
"minLength": 3,
"type": "string"
},
"duplicate_of": {
"maxLength": 120,
"type": "string"
},
"failure_semantics": {
"default": "",
"maxLength": 2000,
"type": "string"
},
"host_behavior": {
"maxLength": 4000,
"minLength": 10,
"type": "string"
},
"host_problem": {
"maxLength": 4000,
"minLength": 10,
"type": "string"
},
"host_repository": {
"maxLength": 300,
"minLength": 3,
"type": "string"
},
"host_source_paths": {
"items": {
"maxLength": 400,
"minLength": 1,
"type": "string"
},
"maxItems": 200,
"minItems": 1,
"type": "array"
},
"host_test_paths": {
"default": [],
"items": {
"maxLength": 400,
"minLength": 1,
"type": "string"
},
"maxItems": 200,
"type": "array"
},
"inputs": {
"default": [],
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 60,
"type": "array"
},
"integration_tests": {
"description": "Alias for `planned_integration_tests`.",
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"license_status": {
"default": "unknown",
"enum": [
"compatible",
"incompatible",
"unknown"
],
"type": "string"
},
"new_behavior": {
"maxLength": 4000,
"minLength": 10,
"type": "string"
},
"novelty_statement": {
"maxLength": 4000,
"minLength": 10,
"type": "string"
},
"opportunity_id": {
"maxLength": 120,
"type": "string"
},
"outputs": {
"default": [],
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 60,
"type": "array"
},
"own_library_candidates": {
"default": [],
"items": {
"maxLength": 200,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"parent_behavior": {
"default": "",
"maxLength": 4000,
"type": "string"
},
"parent_limitations": {
"default": "",
"maxLength": 4000,
"type": "string"
},
"planned_behavior_tests": {
"default": [],
"description": "The behaviour tests that would prove it.",
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"planned_integration_tests": {
"default": [],
"description": "The integration tests that would prove it.",
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"planned_interface": {
"maxLength": 4000,
"minLength": 3,
"type": "string"
},
"planned_regressions": {
"default": [],
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"planned_tests": {
"description": "Alias. An unclassified list of planned tests: each entry is filed as unit, behaviour or integration from its own wording, and counts towards the test invariant.",
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 300,
"type": "array"
},
"planned_unit_tests": {
"default": [],
"description": "The unit tests that would prove it. One of the three planned-test arrays must be non-empty or the gate fails.",
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"proposed_artifact_id": {
"maxLength": 120,
"minLength": 3,
"type": "string"
},
"proposed_name": {
"maxLength": 200,
"minLength": 3,
"type": "string"
},
"proposed_type": {
"enum": [
"COMPOSE",
"SPECIALIZE",
"CREATE"
],
"type": "string"
},
"provenance_status": {
"default": "partial",
"enum": [
"complete",
"partial",
"missing"
],
"type": "string"
},
"reuse_declaration": {
"additionalProperties": false,
"properties": {
"carry_into_artifact": {
"default": [],
"description": "The licence and notice files copied into the artifact's `LICENSES/` folder.",
"items": {
"maxLength": 400,
"minLength": 1,
"type": "string"
},
"maxItems": 40,
"type": "array"
},
"declaration_version": {
"const": "SHPBL-REUSE-DECLARATION/1.0.0",
"default": "SHPBL-REUSE-DECLARATION/1.0.0",
"type": "string"
},
"declared_by": {
"description": "The person who made that declaration. A model, an agent, a policy or a default is refused.",
"maxLength": 160,
"minLength": 2,
"type": "string"
},
"license": {
"description": "The licence as detected in the tree or as stated by the upstream project — e.g. `MIT`, `Apache-2.0`, `AGPL-3.0`.",
"maxLength": 200,
"minLength": 2,
"type": "string"
},
"license_files": {
"default": [],
"description": "The licence and notice files found in the scoped tree.",
"items": {
"maxLength": 400,
"minLength": 1,
"type": "string"
},
"maxItems": 40,
"type": "array"
},
"note": {
"default": "",
"maxLength": 2000,
"type": "string"
},
"obligations": {
"default": [],
"description": "What must be preserved: attribution, notice retention, source disclosure, licence propagation.",
"items": {
"maxLength": 600,
"minLength": 2,
"type": "string"
},
"maxItems": 40,
"type": "array"
},
"reuse_permitted": {
"description": "The human declaration. False is a legal answer and stops the composition; absent is not an answer at all.",
"type": "boolean"
},
"upstream_project": {
"description": "The project the behaviour is being reused from, as `owner/repo` or its published name.",
"maxLength": 300,
"minLength": 3,
"type": "string"
}
},
"required": [
"upstream_project",
"license",
"reuse_permitted",
"declared_by"
],
"type": "object"
},
"specialization_ancestor_ids": {
"default": [],
"items": {
"maxLength": 120,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"state_model": {
"default": "",
"maxLength": 2000,
"type": "string"
},
"unit_tests": {
"description": "Alias for `planned_unit_tests`.",
"items": {
"maxLength": 400,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"what_it_gives_you": {
"maxLength": 2000,
"minLength": 25,
"type": "string"
},
"why_this_repo": {
"maxLength": 2000,
"minLength": 25,
"type": "string"
}
},
"type": "object"
},
"key": {
"description": "Your SHPBL Practitioner key (shpbl_mcp_…). Optional if your client sends it as the `Authorization: Bearer …` header.",
"minLength": 1,
"type": "string"
}
},
"required": [
"intent"
],
"type": "object"
},
"name": "build_intent",
"outputSchema": null
},
{
"description": "The harvest lane: read what a repository can already do, then offer codeless capability nominations that fuse those affordances with owned SHPBL primitive capabilities — DREAM, EVOLUTION, MEMORY, DEFENSE, BRAIN and the rest of the canonical forty, plus the S-Tier artifacts. Each nomination names host evidence, proposed capability bodies, Capability Contract slots, a test plan, and honest limits. It contains no implementation; approved materialization belongs to `harvest_repo`. Free calls return host affordances, then stop before library correlation; nominations require a Practitioner key (7-day free trial).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"github_token": {
"description": "Optional GitHub token (Contents: read) for a private repository.",
"maxLength": 300,
"minLength": 8,
"type": "string"
},
"grants": {
"default": 8,
"description": "How many codeless capability nominations to return, 1 to 200. Ranked by measured fit and capability standing.",
"type": "number"
},
"include": {
"description": "Optional path filter — only paths containing this text are read for affordances.",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"key": {
"description": "Your SHPBL Practitioner subscription key (shpbl_mcp_…). Optional if your client sends it as the `Authorization: Bearer …` request header.",
"minLength": 1,
"type": "string"
},
"pages": {
"default": 4,
"description": "How many source pages to read for affordance evidence, 1 to 12 (about 90,000 characters each). More pages means more of the tree is read; the grants are cut from whatever was read.",
"type": "number"
},
"per_affordance": {
"default": 2,
"description": "How many nominations one affordance may produce, 1 to 200. Raise it to see alternative leads for the same host capability.",
"type": "number"
},
"repo": {
"description": "A GitHub repository: `owner/repo` or a URL.",
"maxLength": 300,
"minLength": 3,
"type": "string"
}
},
"required": [
"repo"
],
"type": "object"
},
"name": "compose_capability",
"outputSchema": null
},
{
"description": "Audit any GitHub repository and get back one complete result: a report (inventory, languages, spine files, risk signals), the capabilities found in it (name, signature, file and line, stated contract, dependencies), and how it stands against SHPBL's anonymous corpus of audited repositories. Works with no key: every caller gets the whole diagnosis of their own repository. A free run stops at the composition boundary — neither library is searched, so no library rows, candidates, parents or proposed architecture are returned — and nothing is retained (no pull request, no export, no recorded run). A Practitioner key (7-day free trial) continues past that boundary: both libraries searched, candidates identified and composed, and the result written back to your own repository. Whatever a run finds is yours. Follow with `fix_repo` for verbatim source and diffs, `harvest_repo` for the whole tree.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"as_free": {
"default": false,
"description": "Run at the free depth even when the key carries a paid tier, so you can see exactly what a caller without a subscription is handed. Costs no allowance and changes nothing else about the audit.",
"type": "boolean"
},
"brief": {
"default": true,
"description": "Default true: keep the audit compact and do not include the full method protocol. Set false to include the protocol block.",
"type": "boolean"
},
"github_token": {
"description": "Optional GitHub token (Contents: read) for a private repository. Not needed if the owner connected the SHPBL GitHub App to this key at https://shpbl.com/mcp-access.",
"maxLength": 300,
"minLength": 8,
"type": "string"
},
"key": {
"description": "Your SHPBL key (shpbl_mcp_…), if you have one. Optional — without it the audit runs at the free depth. Also read from the `Authorization: Bearer …` header.",
"minLength": 1,
"type": "string"
},
"own_library": {
"description": "Your own previously harvested capabilities, read out of your repository's `.shpbl/` library and passed back in. Optional. When present, this run checks your concerns against your own library first and tells you which ones you already solved. It is held in memory for this call only — never stored, never added to SHPBL's library.",
"items": {
"additionalProperties": false,
"properties": {
"api": {
"description": "Exported symbols, if you kept them.",
"items": {
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"maxItems": 20,
"type": "array"
},
"contract": {
"description": "The one-line contract you recorded for it.",
"maxLength": 600,
"type": "string"
},
"name": {
"description": "The capability's name, as you kept it.",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"path": {
"description": "Where it lives in your tree, e.g. `.shpbl/retry-backoff/`.",
"maxLength": 400,
"type": "string"
},
"repo": {
"description": "Which of your repositories it came from.",
"maxLength": 300,
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"maxItems": 300,
"type": "array"
},
"protocol_ack": {
"default": false,
"description": "Set true to say you already hold the SHPBL protocol. The discipline, the ten meta capabilities, the hands-off list and the return shape are then not reprinted even when `brief: false` — they are unchanged and they still bind the run.",
"type": "boolean"
},
"repo": {
"description": "A GitHub repository: `owner/repo`, a github.com URL, or `owner/repo#branch`.",
"maxLength": 300,
"minLength": 3,
"type": "string"
},
"sections": {
"description": "Which sections to print, when you only need some of them. Omit it and the whole audit comes back, which is the right default on a first call. On a follow-up — re-reading the capability list after a repair, or checking the benchmark alone — name just what you need (for example `[\"capabilities\"]`) rather than re-sending the whole audit into the conversation. Nothing is computed differently and nothing costs less; only the printed result is narrower, and the machine-readable payload is unchanged.",
"items": {
"enum": [
"report",
"capabilities",
"benchmark",
"meta",
"library",
"own_library"
],
"type": "string"
},
"minItems": 1,
"type": "array"
}
},
"required": [
"repo"
],
"type": "object"
},
"name": "evaluate_repo",
"outputSchema": null
},
{
"description": "The repair: verbatim source of the files you name — or the repository's spine when you name none — paginated for your context window, with the remediation protocol your model writes the diffs against. Free to run with no key: every file you name, paginated, plus the ordered remediation protocol — repair of what is already there. A free repair stops before either library is searched, so it proposes no composed capability, no candidates and no reuse. A Practitioner key (7-day free trial) crosses that boundary and makes the repair persist — `write_to_repo` opens the branch and the pull request.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"brief": {
"default": false,
"description": "Skip the remediation protocol preamble and return source with a one-line reminder instead. Use it once you already hold the method — `method_protocol` (free) returns it whenever you need it again.",
"type": "boolean"
},
"github_token": {
"description": "Optional GitHub token (Contents: read) for a private repository. Not needed if the SHPBL GitHub App is connected to this key.",
"maxLength": 300,
"minLength": 8,
"type": "string"
},
"key": {
"description": "Your SHPBL key (shpbl_mcp_…), if you have one. Optional — without it the repair returns one file at the free depth. Also read from the `Authorization: Bearer …` header.",
"minLength": 1,
"type": "string"
},
"own_library": {
"description": "Your own previously harvested capabilities, read out of your repository's `.shpbl/` library and passed back in. Optional. When present, this run checks your concerns against your own library first and tells you which ones you already solved. It is held in memory for this call only — never stored, never added to SHPBL's library.",
"items": {
"additionalProperties": false,
"properties": {
"api": {
"description": "Exported symbols, if you kept them.",
"items": {
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"maxItems": 20,
"type": "array"
},
"contract": {
"description": "The one-line contract you recorded for it.",
"maxLength": 600,
"type": "string"
},
"name": {
"description": "The capability's name, as you kept it.",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"path": {
"description": "Where it lives in your tree, e.g. `.shpbl/retry-backoff/`.",
"maxLength": 400,
"type": "string"
},
"repo": {
"description": "Which of your repositories it came from.",
"maxLength": 300,
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"maxItems": 300,
"type": "array"
},
"part": {
"default": 1,
"description": "Which page of source to return. Page 1 reports the total and carries the protocol.",
"maximum": 400,
"minimum": 1,
"type": "integer"
},
"paths": {
"description": "Paths to read, from the evaluation. Omit to read the repository's spine.",
"items": {
"maxLength": 400,
"minLength": 1,
"type": "string"
},
"maxItems": 80,
"type": "array"
},
"protocol_ack": {
"default": false,
"description": "Set true to say you already hold the SHPBL protocol — the discipline, the ten meta capabilities, the hands-off list and the return shape are then not reprinted on page 1. Same effect as `brief` for the preamble, and the honest default for a session that has already called `method_protocol` or run an earlier stage.",
"type": "boolean"
},
"repo": {
"description": "A GitHub repository: `owner/repo` or a URL.",
"maxLength": 300,
"minLength": 3,
"type": "string"
}
},
"required": [
"repo"
],
"type": "object"
},
"name": "fix_repo",
"outputSchema": null
},
{
"description": "The harvest shortcut: point it at a repository you hold a licence to reuse — one you do not own and will never open a pull request against — and it goes straight to the capabilities. It reads what that repository can already do, fuses those affordances with the owned SHPBL capability library, ranks and names the results as proposals a person can read, stops for your decision on each one, and then emits the seed modules for exactly the ones you approved into your own `.shpbl/` library. That is the gauntlet's steps 8, 9 and 10 without the audit, the repair plan or the pull request. It never writes to the target repository. Pass `approve` with `approved_by` and `host_license` to collect the approved grants; pass `mode: \"walk\"` for the older batched ledger walk of the whole tree (`estimate`, `part`, `ledger_digest`, `budget` belong to that mode). Free calls report what the repository can do and what is offerable against it, then stop at the composition boundary; grants need a Practitioner key (7-day free trial).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"approve": {
"description": "Harvest mode: the grant ids the person approved. Only these are emitted. Omit it on the first call — the proposals have to be put to them first. An id nobody proposed refuses the whole set rather than emitting the rest.",
"items": {
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"maxItems": 200,
"type": "array"
},
"approved_by": {
"description": "The name of the person who approved them. Required with `approve`. An agent, a model, a vendor, a policy or a default is refused, not recorded.",
"maxLength": 120,
"minLength": 2,
"type": "string"
},
"brief": {
"description": "Walk mode only: skip the harvest protocol preamble on batch 1 and spend the payload on source. Use it once you already hold the method — `method_protocol` (free) returns it verbatim.",
"type": "boolean"
},
"budget": {
"description": "Characters per batch — a whole number from 10,000 to 120,000. Defaults to 90000; lower it for a smaller context window, raise it only if the client can carry it. Out-of-range values are refused in plain words, not silently clamped.",
"type": "number"
},
"carry_notice_files": {
"description": "Licence or notice files from the host that must be copied into the artifact. Detected candidates are reported to you if you omit this.",
"items": {
"maxLength": 300,
"minLength": 1,
"type": "string"
},
"maxItems": 40,
"type": "array"
},
"cml_license": {
"description": "Your perpetual copy's licence key, if you hold one. It changes retention, never depth.",
"maxLength": 200,
"minLength": 4,
"type": "string"
},
"decline": {
"description": "Harvest mode: the grant ids the person explicitly said no to. Only these are recorded as declined; anything they were not asked about stays open and is re-offered, never written down as a refusal.",
"items": {
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"maxItems": 200,
"type": "array"
},
"estimate": {
"default": false,
"description": "Return the size of the walk only — batch count, total characters, largest batch, split files — with no source.",
"type": "boolean"
},
"github_token": {
"description": "Optional GitHub token (Contents: read) for a private repository. Not needed if the SHPBL GitHub App is connected to this key.",
"maxLength": 300,
"minLength": 8,
"type": "string"
},
"governor_key": {
"description": "Operator passphrase for SHPBL's own copy. Resolved by the server; it changes only where the harvest is staged, never what is proposed.",
"maxLength": 300,
"minLength": 8,
"type": "string"
},
"grants": {
"default": 8,
"description": "Harvest mode: how many capability proposals to rank, 1 to 200. There is no fixed shallow ceiling any more — a sophisticated repository can support far more than a couple of dozen higher-order compositions, and the safeguard against a weak proposal is the approval and the Capability Contract, not a small number here.",
"type": "number"
},
"host_license": {
"description": "What the target repository's licence permits for this reuse, and any obligation it attaches — for example `MIT, attribution required`. Required with `approve`; SHPBL records your declaration and does not verify it.",
"maxLength": 400,
"minLength": 2,
"type": "string"
},
"include": {
"description": "Optional path filter — only paths containing this text are harvested.",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"key": {
"description": "Your SHPBL Practitioner subscription key (shpbl_mcp_…). Optional if your client sends it as the `Authorization: Bearer …` request header.",
"minLength": 1,
"type": "string"
},
"ledger_digest": {
"description": "The ledger folded so far, handed back by a previous session so this batch continues the same run instead of starting over.",
"maxLength": 60000,
"minLength": 1,
"type": "string"
},
"mode": {
"description": "`harvest` (the default when nothing else in the call implies a walk) is the shortcut: proposals, your decision, then the seed modules for what you approved. `walk` is the older batched ledger walk of the whole tree, which reads and classifies but composes nothing. Send it explicitly whenever you also send `part`, `ledger_digest`, `budget` or `brief`.",
"enum": [
"harvest",
"walk"
],
"type": "string"
},
"novelty_threshold": {
"description": "Harvest mode: how different a proposal must be from the higher-ranked ones already chosen, 0 to 1, measured on bound capabilities and title vocabulary. 0 suppresses only exact duplicates; 0.4 is firm de-duplication of near-identical variants.",
"type": "number"
},
"pages": {
"default": 4,
"description": "Harvest mode: how many source pages to read for evidence, 1 to 12 (about 90,000 characters each). Proposals are cut only from what was actually read.",
"type": "number"
},
"part": {
"description": "Walk mode only: which batch to return, 1 to 2000. Batch 1 carries the protocol and the manifest; walk them all in order.",
"type": "number"
},
"per_affordance": {
"default": 2,
"description": "Harvest mode: how many proposals one host affordance may produce, 1 to 200.",
"type": "number"
},
"quality_floor": {
"description": "Harvest mode: drop proposals scoring below this, 0 to 1. The score is a discovery aid for ordering what to read first — it is never evidence that a capability deserves to exist.",
"type": "number"
},
"repo": {
"description": "A GitHub repository: `owner/repo` or a URL.",
"maxLength": 300,
"minLength": 3,
"type": "string"
},
"reuse_obligations": {
"description": "The obligations the licence attaches that must be preserved in the artifact — attribution, notice retention, share-alike, and so on. Recorded against every emitted artifact and carried into its manifest.",
"items": {
"maxLength": 300,
"minLength": 2,
"type": "string"
},
"maxItems": 20,
"type": "array"
},
"reuse_permitted": {
"description": "Required with `approve`: the person's explicit statement that reuse of this upstream project is permitted for this composition. Absence is never a yes, and SHPBL does not infer permission from a detected licence file. Recording your declaration is not legal verification and nothing here is legal advice.",
"type": "boolean"
},
"suppress_duplicates": {
"description": "Harvest mode: drop proposals whose proposed composition is identical to a higher-ranked one. Default true.",
"type": "boolean"
},
"upstream_project": {
"description": "The upstream project the reuse is declared against. Defaults to the repository being harvested.",
"maxLength": 200,
"minLength": 2,
"type": "string"
}
},
"required": [
"repo"
],
"type": "object"
},
"name": "harvest_repo",
"outputSchema": null
},
{
"description": "Read one long SHPBL document, paged for a context window: `volume` (the complete text of a volume of The Strategic Master Library), `catalog_outline` (the Collective catalog's parts, component classes, agent-kit steps and verification axes), `report_template` (the branded audit report HTML to fill in), or `standing_order` (the prompt that governs a run). Requires a Practitioner key.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"document": {
"description": "Which document to read.",
"enum": [
"volume",
"catalog_outline",
"report_template",
"standing_order"
],
"type": "string"
},
"key": {
"description": "Your SHPBL subscription key (shpbl_mcp_…). Optional if your client sends it as the `Authorization: Bearer …` request header.",
"minLength": 1,
"type": "string"
},
"part": {
"default": 1,
"description": "1-based page of the document, up to 60.",
"type": "number"
},
"section": {
"description": "For `document: catalog_outline` — only parts or sections whose name contains this text.",
"minLength": 2,
"type": "string"
},
"volume": {
"description": "Required for `document: volume` — the volume slug or its number, 1 through 7.",
"minLength": 1,
"type": "string"
}
},
"required": [
"document"
],
"type": "object"
},
"name": "library_document",
"outputSchema": null
},
{
"description": "Everything published on shpbl.com in one read: the editions and their prices and licences, the seven volumes of The Strategic Master Library with their seals and read links, the public downloads with byte sizes, and the case studies of real audit runs with each verdict, and `pools` — the canonical reconciliation of every count this server quotes, so two totals are never mistaken for a contradiction and never added together. Scope it with `sections`, or pass `volume` (slug or 1-7) or `case_study` (slug) for one record in full. Free — no key, no allowance.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"case_study": {
"description": "One case study in full, by slug — what the run got right and what it learned.",
"minLength": 1,
"type": "string"
},
"sections": {
"description": "Which sections to return. Omit for all of them: facts, volumes, editions, downloads, case_studies, pools. `pools` is the canonical reconciliation of every count this server quotes — read it before comparing two totals.",
"items": {
"enum": [
"facts",
"volumes",
"editions",
"downloads",
"case_studies",
"pools"
],
"type": "string"
},
"minItems": 1,
"type": "array"
},
"volume": {
"description": "One volume in full, by slug or by number 1-7. Its complete text is a `library_document` call.",
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "library_index",
"outputSchema": null
},
{
"description": "Search the Collective Master Library for a capability in plain words, before writing new code. `scope: \"catalog\"` (Practitioner) searches the engineered components — class, what each does, API surface, line counts, verification marks. `scope: \"composites\"` searches capabilities earlier runs invented for one host by fusing library parts, each citing its sealed report. Pass `ids` for whole rows by component ID, with siblings and declared twins. Multi-word queries match term by term and rank; with no exact hit you get the closest rows, labelled as such.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"certified_only": {
"default": false,
"description": "Crown jewels only: return only rows whose body the certification harness executed and read clean (CERTIFIED or PROVISIONAL). This withholds the INCONCLUSIVE rows — bodies the harness could not exercise, which still exist and still ship. Leave this off (the default) to see them too; the withheld figure is reported as `certification.withheldInconclusive`.",
"type": "boolean"
},
"component_class": {
"description": "Catalog only: restrict to one component class, e.g. `CrownJewel/S-Tier`, `Block/Engine`. Substring match.",
"minLength": 2,
"type": "string"
},
"ids": {
"description": "Up to 20 component IDs (e.g. `STIER-S-84`, `BLD-ENG-303`) returned in full instead of a search.",
"items": {
"minLength": 2,
"type": "string"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
},
"include_siblings": {
"default": false,
"description": "With `ids`: also list up to 12 other component IDs in the same class, for comparison.",
"type": "boolean"
},
"key": {
"description": "Your SHPBL subscription key (shpbl_mcp_…). Optional if your client sends it as the `Authorization: Bearer …` request header.",
"minLength": 1,
"type": "string"
},
"limit": {
"description": "Alias for `page_size`, 1 to 50. Given both, `page_size` wins.",
"type": "number"
},
"pack": {
"description": "Vault only: restrict to one vertical pack, e.g. `fintech-v1`. Substring match.",
"minLength": 2,
"type": "string"
},
"page": {
"default": 1,
"description": "1-based page of results. A page past the end is refused, never returned empty.",
"type": "number"
},
"page_size": {
"description": "Rows per page, 1 to 50. Defaults to 20.",
"type": "number"
},
"query": {
"description": "Plain-words capability, name, ID or API symbol. Omit to page the whole pool.",
"minLength": 2,
"type": "string"
},
"scope": {
"default": "catalog",
"description": "`catalog` — engineered components (Practitioner). `crown-jewels` — the S-Tier Vault of standalone lab-curated artifacts. `composites` — capabilities past runs invented for one host. (`vault` is no longer available; asking for it returns a pointer to these scopes.)",
"enum": [
"catalog",
"vault",
"crown-jewels",
"composites"
],
"type": "string"
}
},
"type": "object"
},
"name": "library_search",
"outputSchema": null
},
{
"description": "Lists real repository names so a run never starts on a guessed one, and answers whether a repository can be written to. Pass `github_token` to see everything that token can see, or `owner` to list a public account's repositories; with neither, it lists the repositories the SHPBL GitHub App is installed on for this key — the same ones a pull request can be opened on. Pass `repo: \"owner/name\"` to ask about one target instead of reading the whole list. Free — costs no allowance.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"github_token": {
"description": "A GitHub token (PAT or fine-grained) to list with. Never stored, never logged — used for this call only.",
"minLength": 1,
"type": "string"
},
"key": {
"description": "Your SHPBL key (shpbl_mcp_…), only needed to list App-connected repositories. Optional if sent as the Authorization header.",
"minLength": 1,
"type": "string"
},
"limit": {
"default": 30,
"description": "How many repositories to return (default 30, max 100).",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"owner": {
"description": "A GitHub user or organisation to list the public repositories of, when no token is available.",
"minLength": 1,
"type": "string"
},
"page": {
"default": 1,
"description": "Which page of the connected-repository list to return, 1-based. Use this rather than a higher `limit` past 100; the response names the next page when there is one.",
"minimum": 1,
"type": "integer"
},
"repo": {
"description": "Ask about one target, `owner/repo`: whether this key may open a pull request on it. Call this before offering to write.",
"maxLength": 300,
"minLength": 3,
"type": "string"
}
},
"type": "object"
},
"name": "list_repos",
"outputSchema": null
},
{
"description": "Return the SHPBL disciplines verbatim — evaluation, remediation and harvest — plus the component classes' verification axes and the reporting style. Free and unmetered. Fetch it once, then call `fix_repo` or `harvest_repo` with `brief: true` so their payload is source rather than repeated instructions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"stage": {
"description": "One stage only: `evaluate`, `fix` or `harvest`. Omit for all three.",
"enum": [
"evaluate",
"fix",
"harvest"
],
"type": "string"
}
},
"type": "object"
},
"name": "method_protocol",
"outputSchema": null
},
{
"description": "Build `HOST-SOURCE-MANIFEST.json` for canonical step 1 from a GitHub repository, online, with no clone and no download: every file's Git blob identity, the byte length, the head commit, and the `SHPBL-SOURCE-DIGEST/1` digest over the pinned tree. Write the returned JSON to your run folder as `HOST-SOURCE-MANIFEST.json` and step 1 passes the gate. Free and unmetered. If the run is offline instead, do not call this — run `node tools/source-manifest.mjs <repo-dir|repo.zip>` from the edition, which produces the same manifest from a directory or straight out of the repository ZIP. Never invent the digest or the commit.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"github_token": {
"description": "Optional GitHub token (Contents: read) for a private repository.",
"maxLength": 300,
"minLength": 8,
"type": "string"
},
"key": {
"description": "Your SHPBL key, if you have one. Optional — this tool is free; a key only helps reach a private repository through a connected GitHub App install.",
"minLength": 1,
"type": "string"
},
"label": {
"description": "What to call the target in the manifest. Defaults to `owner/repo@branch`.",
"maxLength": 200,
"type": "string"
},
"repo": {
"description": "A GitHub repository: `owner/repo`, a github.com URL, or `owner/repo#branch`.",
"maxLength": 300,
"minLength": 3,
"type": "string"
}
},
"required": [
"repo"
],
"type": "object"
},
"name": "pin_source",
"outputSchema": null
},
{
"description": "Read the canonical twelve-step run contract, or check a run bundle against it. Call it with no `files` to get the contract itself: every step's id, the artifacts it must produce, the exact condition that closes it, the terminal word to report when it does not, the instruction-precedence order, the retention rule and the two legal ends of step 12. Call it with `files` — a map of run-folder paths to their text — to get the machine verdict: which step blocked, which predicate refused and why. This is the identical implementation the offline `tools/run-gate.mjs` in every edition is bundled from, so the two cannot disagree about whether a bundle satisfies the contract. What they do not share is evidence: the offline gate checks the bundle you hand it, while a connected run can also confirm against the real repository tree that the files cited exist and say what the bundle claims. Same rules, one with a witness. Free, unmetered, read-only, stateless. Never infer a step, reorder one, or declare a run finished on your own reading — run the gate and report its word.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"files": {
"additionalProperties": {
"type": "string"
},
"description": "The run bundle as `path: text`, relative to the run folder (for example `STEP-LEDGER.json`). Send the canonical outputs you have; the gate says what is missing. Bounded: at most 400 entries and 8 MB of text in one call, and identical diagnostics are collapsed to one line with a count rather than repeated per entry. Omit this to read the contract without evaluating anything.",
"type": "object"
},
"through_step": {
"description": "Evaluate gates through this step only. Defaults to 12.",
"maximum": 12,
"minimum": 1,
"type": "integer"
}
},
"type": "object"
},
"name": "run_contract",
"outputSchema": null
},
{
"description": "One runner for an entire SHPBL repository audit and repair: survey, opening library comparison, evaluation, repair, the batched harvest, closing library comparison, the branded HTML report, and the write-back path. STRICT SEQUENCE: call it once with no `step` for the run card, then `step: 1`, `step: 2`, one step per turn, in order. Do the returned step, report one line to the person, then call the next. Never call two steps in one turn, never attempt the whole run at once, and never infer a finding you were not handed. From `step: 2` on you must pass `ledger_digest`; every 3 steps (adjustable with `checkpoint_interval`, max 10, only when the person asks for fewer pauses) the run pauses and you must ask the person before continuing, then pass `continue_ack: \"continue\"`. The final step hands over the report template and the write-back path. Your own model does all reading and writing. This full conductor requires a Practitioner key (7-day free trial). The free lane provides repository evaluation, not a partial or full gauntlet.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"budget": {
"description": "Characters per harvest step — a whole number from 10,000 to 120,000. Defaults to a moderate 45,000 so each step stays readable and cheap; raise it toward 90,000 only if the person asks for fewer, heavier steps.",
"type": "number"
},
"checkpoint_interval": {
"description": "How many harvest steps between check-ins with the person. Defaults to 3; raise it (up to 10) only when the person has asked for fewer pauses. Never set it silently — the check-ins are how the person stays in the loop. Once set it rides inside the run's `fold_token`, so passing it again on later steps is not required; if you ever start a fresh chain, set it again or the run returns to 3.",
"type": "number"
},
"continue_ack": {
"description": "The person's approval to continue past a checkpoint. Every 3 harvest steps this run pauses: report to the person, ask whether to continue, and only when they say yes call the next step with `continue_ack: \"continue\"`. Never send it without asking.",
"maxLength": 40,
"minLength": 1,
"type": "string"
},
"fold_token": {
"description": "The `fold_token` returned by the previous step, passed back verbatim. Required from `step: 2` onward: it is signed by this server and carries the previous step's number and the hash of the ledger you held then, so a step cannot be skipped and a ledger cannot be truncated or replaced. Never edit it, never write one yourself.",
"maxLength": 2000,
"minLength": 1,
"type": "string"
},
"github_token": {
"description": "Optional GitHub token (Contents: read) for a private repository. Not needed if the SHPBL GitHub App is connected to this key.",
"maxLength": 300,
"minLength": 8,
"type": "string"
},
"include": {
"description": "Optional path filter — only paths containing this text are in scope for the whole run.",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"key": {
"description": "Your SHPBL Practitioner subscription key (shpbl_mcp_…). Optional if your client sends it as the `Authorization: Bearer …` request header.",
"minLength": 1,
"type": "string"
},
"ledger_digest": {
"description": "The ledger folded so far, one line per capability, **each line carrying the file path it came from** (for example `src/lib/queue.ts — retry with backoff`). Required from `step: 2` onward — it is the proof that you actually folded the previous step — and required on the closing step so the closing library comparison runs against what you harvested. The server checks shape as well as length: a ledger that names no paths, or is padded out around one, is refused (and not charged).",
"maxLength": 60000,
"minLength": 1,
"type": "string"
},
"own_library": {
"description": "Your own previously harvested capabilities, read out of your repository's `.shpbl/` library and passed back in. Optional. When present, this run checks your concerns against your own library first and tells you which ones you already solved. It is held in memory for this call only — never stored, never added to SHPBL's library.",
"items": {
"additionalProperties": false,
"properties": {
"api": {
"description": "Exported symbols, if you kept them.",
"items": {
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"maxItems": 20,
"type": "array"
},
"contract": {
"description": "The one-line contract you recorded for it.",
"maxLength": 600,
"type": "string"
},
"name": {
"description": "The capability's name, as you kept it.",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"path": {
"description": "Where it lives in your tree, e.g. `.shpbl/retry-backoff/`.",
"maxLength": 400,
"type": "string"
},
"repo": {
"description": "Which of your repositories it came from.",
"maxLength": 300,
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"maxItems": 300,
"type": "array"
},
"personality": {
"description": "How the person wants to be spoken to for this run: technical, professional, friendly, light, coach, deadpan. Ask them once before step 0 and pass what they choose; it rides the run and changes wording only, never a finding, a state or a gate. Defaults to professional when they have no preference. Pass `none` to switch the voice off entirely — bare wording, no openers, no asides — which is the right setting for an automated reviewer reading the run as evidence.",
"maxLength": 40,
"type": "string"
},
"protocol_ack": {
"default": false,
"description": "Set true to say this session already holds the SHPBL protocol. The discipline, the ten meta capabilities, the hands-off list and the return shapes are then not printed on step 0 or step 1 — they are unchanged and they still bind the run. Use it when you have already called `method_protocol` or run a staged tool in this session; it saves tens of thousands of characters of repetition.",
"type": "boolean"
},
"repo": {
"description": "A GitHub repository: `owner/repo`, a URL, or `owner/repo#branch`.",
"maxLength": 300,
"minLength": 3,
"type": "string"
},
"step": {
"default": 0,
"description": "0 to 2000. 0 (default) returns the run card and the plan with no source. 1…N walk the harvest batches, one per turn and in order. N+1 closes the run with the report template and the write-back path. Do not skip ahead.",
"type": "number"
}
},
"required": [
"repo"
],
"type": "object"
},
"name": "run_gauntlet",
"outputSchema": null
},
{
"description": "Runs SHPBL's own audit against the running server and returns one pass/fail/unavailable line per verification axis: the registered tool surface against the priced tier table, version agreement across the published files, subscription-register reachability, catalog reachability, repository-write authority, and billing wiring. Free, unmetered, read-only — nothing is written and no model is called. Use it to prove the server is live and consistent before starting a run, or when a tool answered in a way that looks wrong.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"verbose": {
"default": false,
"description": "Include the full tool-to-tier table and the axis definitions in the answer.",
"type": "boolean"
}
},
"type": "object"
},
"name": "selfcheck_mcp",
"outputSchema": null
},
{
"description": "Report the tiers of this MCP server and — from the `key` argument or the same `Authorization` header the gated tools read — that key's tier, status and month-to-date usage. This is the authoritative answer to \"am I connected, and what do I have\".",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"key": {
"description": "Optional SHPBL subscription key. Omit it if your client sends the key as a request header.",
"maxLength": 120,
"type": "string"
}
},
"type": "object"
},
"name": "subscription_status",
"outputSchema": null
},
{
"description": "Call this first, once, when a person connects. Returns the welcome, the full tool menu with one line per tool, the exact sentences a person can say to start a run, the support address, and the link to the user's manual. Free, unmetered, no key. Read it to the person in your own words — warmly and briefly — then ask what they would like to point it at.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"name": {
"description": "The person's first name, if you know it, so the greeting can use it.",
"maxLength": 80,
"type": "string"
}
},
"type": "object"
},
"name": "welcome",
"outputSchema": null
},
{
"description": "Land finished work in a repository as a pull request: pass the files you wrote (full new contents, not diffs) and this opens a branch and a PR for the human to review and merge. Nothing is ever pushed to the default branch. Requires a SHPBL Practitioner key and the SHPBL GitHub App installed on that repository (or a one-off `github_token`). The caller chooses the repository — ask which one, or call `list_repos` first; never assume. Where things go:\nHarvest output belongs under `.shpbl/` in **the caller's own repository** — the person who asked for the run — and never in the repository that was harvested. Those are frequently not the same repository: a run may read a public open-source project, or a repository the caller merely has access to, and writing a harvest back into a source repository would be putting our output into somebody else's software. Sources a run may read: public repositories that carry a proper open-source license, the caller's own repositories, or private repositories the caller has access to. The server never reads a repository the caller has no right to read, and it never absorbs customer harvests back into the public library.\n- `.shpbl/README.md` — the index of their capability library (this tool scaffolds it when it is absent).\n- `.shpbl/<run-seal>/LEDGER.md` — the folded ledger for one run.\n- `.shpbl/<run-seal>/REPORT.html` — the branded report, if one was produced.\n- `.shpbl/<capability-name>/` — a capability kept as source, one folder each.\n- `.shpbl/COMPOSITES.md` — your own composites: capabilities this run invented for your repository by fusing parts that did nothing alone. Record each as `- <name> — <what it fuses> — <why neither part sufficed>`. These are yours and stay private; SHPBL's global composites ledger is fed only by Governor-keyed published runs, so never send yours anywhere and never expect them to appear there.\nIf the harvested repository is not the caller's own, the harvest still lands in the caller's `.shpbl/` and the source is named in provenance. Ask the person which of their repositories is the home for their library if it is not obvious, and stop for that answer rather than guessing.\nGive each kept capability a one-line contract in `.shpbl/README.md`, in the form `- <name> — <path> — <contract>`. That index is what makes the library reusable: on the next run, read it and pass those entries as `own_library` to `evaluate_repo`, `fix_repo` or `run_gauntlet`, and the run will tell you which concerns you already solved before citing anything new. Those entries stay yours — they are held for the call and never stored by SHPBL.\nRepairs are the exception: write the repaired file at its own path, never under `.shpbl/`.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"base_ref": {
"description": "Branch to open against. Defaults to the repository's default branch.",
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"branch": {
"description": "Branch to write on. Defaults to one derived from `run_id`, or `shpbl/<date>-<n>`; reusing a name appends to that PR.",
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"build_authorization": {
"description": "The signed build authorizations `build_intent` returned, one per artifact this pull request lands. Required when `kind` is `foundry`: the server verifies each against its own Build Intent ledger and refuses to land an artifact it never gated.",
"items": {
"maxLength": 4000,
"minLength": 20,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"files": {
"description": "Complete file contents to commit. For a repair, the whole fixed file — not a diff.",
"items": {
"additionalProperties": false,
"properties": {
"path": {
"description": "Repository-relative path.",
"maxLength": 400,
"minLength": 1,
"type": "string"
},
"text": {
"description": "The complete new contents of the file.",
"maxLength": 400000,
"type": "string"
}
},
"required": [
"path",
"text"
],
"type": "object"
},
"maxItems": 200,
"minItems": 1,
"type": "array"
},
"github_token": {
"description": "One-off GitHub token with Contents and Pull requests write. Used for this call only and never stored. Omit it if the SHPBL GitHub App is installed.",
"maxLength": 500,
"minLength": 20,
"type": "string"
},
"key": {
"description": "Your SHPBL subscription key (shpbl_mcp_…). Optional if your client sends it as the `Authorization: Bearer …` request header.",
"minLength": 1,
"type": "string"
},
"kind": {
"description": "What this pull request lands. `harvest` means kept capabilities and a ledger: write them under `.shpbl/` and this scaffolds `.shpbl/README.md` as the index of their own capability library when it is missing. `foundry` means built software and its tests, landing under `.shpbl/` beside the index the same way a harvest does — only ever an artifact whose Build Intent `build_intent` authorised. `repair` means fixed files at their own paths, and nothing is scaffolded.",
"enum": [
"harvest",
"repair",
"foundry"
],
"type": "string"
},
"repo": {
"description": "The GitHub repository to write to: `owner/repo` or a URL.",
"maxLength": 300,
"minLength": 3,
"type": "string"
},
"run_id": {
"description": "A stable id for this piece of work (a harvest run seal, a repair order id). Retrying with the same run_id lands on the same branch and updates the same pull request instead of opening a second one. Prefer this over `branch`.",
"maxLength": 60,
"minLength": 3,
"type": "string"
},
"summary": {
"description": "Pull request body: the repair order, or the run seal and coverage of a harvest. Markdown.",
"maxLength": 60000,
"minLength": 3,
"type": "string"
},
"title": {
"description": "Pull request title — say what the change does.",
"maxLength": 200,
"minLength": 3,
"type": "string"
}
},
"required": [
"repo",
"title",
"summary",
"files"
],
"type": "object"
},
"name": "write_to_repo",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:139272ae93e7558505a87b3fdb1b8c44890be964f7f636cd7826e1b8d1a10052 | sha256sum