{"server":"io.github.lonniev/cypher-mcp","count":50,"changes":[{"tool":"cypher_update_coupon","kind":"changed","observed_at":"2026-10-08T16:16:34.584Z","fields":["description","inputSchema"],"description_before":"Patch a coupon's editable fields.\n\nPass only the fields you want to change.  To set a cap to\nunlimited (NULL in the schema), pass ``clear_uses_per_patron=true``\nor ``clear_total_uses=true``.  Renaming the code is allowed —\nexisting patron redemption rows survive (they key on coupon id).\n\nRESTRICTED to operator — requires proof.","description_after":"Patch a coupon's editable fields.\n\nPass only the fields you want to change.  To set a cap to\nunlimited (NULL in the schema), pass ``clear_uses_per_patron=true``\nor ``clear_total_uses=true``.  Renaming the code is allowed —\nexisting patron redemption rows survive (they key on coupon id).\n``tool_ids`` replaces the coupon's binding — tool ids or MCP tool\nnames, ``[\"*\"]`` for every paid tool, ``[]`` to unbind it.\n\nRESTRICTED to operator — requires proof.","description_similarity":0.792,"before_hash":"37c4a89af4a90cd291dc094b64be2ad5","after_hash":"670e4b9acded53c7eabc0c6109e77d31"},{"tool":"cypher_mint_coupon","kind":"changed","observed_at":"2026-10-08T16:16:34.584Z","fields":["description","inputSchema"],"description_before":"Create a new operator-owned discount coupon.","description_after":"Create a new operator-owned discount coupon.\n\nThe coupon owns its binding: ``tool_ids`` names the tools it\ndiscounts, and re-pricing a tool never touches it. A coupon bound\nto no tool discounts nothing, however many patrons redeem it.","description_similarity":0.233,"before_hash":"4611aa26abd634b7a0df5949e413cd0f","after_hash":"c27edb31ae8cfec7e52e6514a3dce55b"},{"tool":"cypher_check_proof_status","kind":"changed","observed_at":"2026-09-29T21:36:48.370Z","fields":["description","inputSchema"],"description_before":"Check whether a previously-cached dpop_token is still valid.\n\nMirrors ``check_oauth_status`` for the npub-proof flow: a calling\nagent can ask \"will my next paid call accept this dpop_token?\"\nbefore burning credits on a guaranteed failure.\n\nFree, no side effects — does not evict the cache or touch relays.","description_after":"Check whether a proof grant is still valid.\n\nMirrors ``check_oauth_status`` for the npub-proof flow: a calling\nagent can ask \"will my next paid call accept this dpop_token?\"\nbefore burning credits on a guaranteed failure. Expiry is read from\nthe grant itself; the only store consulted is the patron's\nrevocation watermark.\n\nFree, no side effects — touches no relay.","description_similarity":0.617,"before_hash":"fe89df6a3aff177f6eb363f4e15784d9","after_hash":"16086c443bec2cfb13c02e67e46dede8"},{"tool":"cypher_receive_npub_proof","kind":"changed","observed_at":"2026-09-29T21:36:48.370Z","fields":["description"],"description_before":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n**Call this only after the user confirms they have replied.**\nDeterministic, one-shot retrieval: name the response with\n``(patron_npub, dpop_token)`` — the ``dpop_token`` being the value\nreturned by ``request_npub_proof``. The tool drains ONLY the pinned\nrendezvous relay that challenge was published on, stopping at the DM\nwhose phrase matches. Mismatched DMs are deleted and NACK'd (without\nrevealing the expected phrase). If called before the user replies,\ntheir message will never be found. Do NOT poll, loop, or retry.\n\nThe signed DM itself proves npub ownership (the patron's nsec\nsigned it). On success, returns the ``dpop_token`` — the same\ntoken. The calling application MUST remember it and pass it as the\n``dpop_token`` parameter on every subsequent paid tool call. The\nproof (a hash of the token) is stored in the vault keyed by that\nhash — the MCP never stores the raw token itself. Free.","description_after":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n**Call this only after the user confirms they have replied.**\nDeterministic, one-shot retrieval: name the response with\n``(patron_npub, dpop_token)`` — the ``dpop_token`` being the value\nreturned by ``request_npub_proof``. The tool drains ONLY the pinned\nrendezvous relay that challenge was published on, stopping at the DM\nwhose phrase matches. Mismatched DMs are deleted and NACK'd (without\nrevealing the expected phrase). If called before the user replies,\ntheir message will never be found. Do NOT poll, loop, or retry.\n\nThe signed DM itself proves npub ownership (the patron's nsec\nsigned it). On success, returns a new ``dpop_token``: an\nOperator-signed **proof grant envelope** ``{\"grant\": …, \"nonce\": …}``\nbound to the patron, this challenge, and the duration the patron\nnamed. The calling application MUST remember that whole string and\npass it as ``dpop_token`` on every subsequent paid tool call. The\ngrant is self-verifying; nothing about it is stored here. Free.","description_similarity":0.787,"before_hash":"9c1e9b99c1f5fa356f67b6a8d1961a7c","after_hash":"ae525f5c8cca37aa22f8402b62cbb360"},{"tool":"cypher_request_npub_proof","kind":"changed","observed_at":"2026-09-29T21:36:48.370Z","fields":["description"],"description_before":"Request npub ownership proof from a patron via Nostr DM.\n\nThis is the npub-OWNERSHIP-PROOF flow — use it when a call returns\n``proof_required``. It proves the caller controls an npub; it does\nNOT deliver any service secret. To hand an operator its API keys or\nOAuth secrets, use ``request_credential_channel`` instead.\n\nSends a challenge DM that the patron must sign and reply to\nusing their Nostr client. **This is a human-in-the-loop flow.**\n\nAfter calling this tool, STOP and tell the user to check their\nNostr client and reply to the challenge. Wait for the user to\nconfirm they have replied before calling ``receive_npub_proof``.\nDo NOT poll or retry — each ``receive_npub_proof`` call\ndestructively drains the relay mailbox.\n\n**Returns** a ``dpop_token`` — the demonstrated-proof-of-possession\ntoken that the calling application MUST remember and pass as the\n``dpop_token`` parameter on every subsequent paid tool call. The MCP\ndoes not retain this value across restarts.\n\n**Lifecycle:** The cached proof expires after the patron's\nchosen duration. When it expires, call ``request_npub_proof``\nagain for a fresh challenge, then wait for the user, then\ncall ``receive_npub_proof``.\n\nFree.","description_after":"Request npub ownership proof from a patron via Nostr DM.\n\nThis is the npub-OWNERSHIP-PROOF flow — use it when a call returns\n``proof_required``. It proves the caller controls an npub; it does\nNOT deliver any service secret. To hand an operator its API keys or\nOAuth secrets, use ``request_credential_channel`` instead.\n\nSends a challenge DM that the patron must sign and reply to\nusing their Nostr client. **This is a human-in-the-loop flow.**\n\nAfter calling this tool, STOP and tell the user to check their\nNostr client and reply to the challenge. Wait for the user to\nconfirm they have replied before calling ``receive_npub_proof``.\nDo NOT poll or retry — each ``receive_npub_proof`` call\ndestructively drains the relay mailbox.\n\n**Returns** a ``dpop_token`` — the one-time challenge nonce shown in\nthe DM. Pass it to ``receive_npub_proof`` to collect the reply. It\nis a matching token, not a credential: on its own it authorizes\nnothing.\n\n**Lifecycle:** ``receive_npub_proof`` returns the proof grant, which\nexpires after the duration the patron named in their reply. When it\nexpires, call ``request_npub_proof`` again for a fresh challenge,\nthen wait for the user, then call ``receive_npub_proof``.\n\nFree.","description_similarity":0.748,"before_hash":"0c0af6c5e396ff5c45d6ea9a4979c662","after_hash":"f5e2fc974f1c3988f379782b8bd9e0d4"},{"tool":"cypher_restore_neon_schema","kind":"changed","observed_at":"2026-09-29T03:39:11.627Z","fields":["description"],"description_before":"Re-run ``ensure_schema()`` on every NeonVault this operator uses.\n\nDiagnostic / recovery tool for the case where the Neon HTTP SQL API\nis returning persistent 4xx errors and the operator suspects the\nschema isn't there or grants are wrong. Idempotent — uses\n``CREATE TABLE IF NOT EXISTS`` so a successful re-run is harmless.\n\nReturns the per-step result. If any step raises, surfaces the Neon\nerror message inline (0.31.0 reads the SQL error body that earlier\nwheels swallowed behind ``raise_for_status``).\n\nRESTRICTED to operator — requires proof (nsec-signed).","description_after":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects a table or grant is missing. Every statement is\nidempotent, so a clean re-run is harmless; the breadcrumb is rewritten\nat the end. Returns one step per concern, with Neon's own error text\ninline for any that failed.\n\nRESTRICTED to operator — requires proof (nsec-signed).","description_similarity":0.372,"before_hash":"28b3fcba037af51ae3ea34569d46d49d","after_hash":"2ed35531b97693741bc195e74346a1da"},{"tool":"cypher_which_service_handles","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Find which service handles a given intent.","description_similarity":null,"before_hash":"7c86327e1ebaaad72cbdae658533ebda","after_hash":"7c86327e1ebaaad72cbdae658533ebda"},{"tool":"cypher_what_realizes_capability","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Find the symbols that implement a capability.","description_similarity":null,"before_hash":"737027172b626c744848d7208bc6c1a8","after_hash":"737027172b626c744848d7208bc6c1a8"},{"tool":"cypher_upsert_pull_request","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Upsert the live state of a GitHub PR into the graph.","description_similarity":null,"before_hash":"db919f2e77d22fd6a53fcc7d0e45c960","after_hash":"db919f2e77d22fd6a53fcc7d0e45c960"},{"tool":"cypher_upsert_patent_element","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Record a patent reference numeral as a node.","description_similarity":null,"before_hash":"b2434e540f6491a665fad4a6ec1348ab","after_hash":"b2434e540f6491a665fad4a6ec1348ab"},{"tool":"cypher_upsert_capability","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Record a cross-cutting service Capability and one of its owners.","description_similarity":null,"before_hash":"7be09f819a735df029df54dee86a49d5","after_hash":"7be09f819a735df029df54dee86a49d5"},{"tool":"cypher_symbols_in_service","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"List a service's indexed symbols.","description_similarity":null,"before_hash":"22f5832b728b7d87af20f547f81bae56","after_hash":"22f5832b728b7d87af20f547f81bae56"},{"tool":"cypher_symbol_provenance","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Pivot to a code symbol — its service, capabilities, issues, decisions, invariants.","description_similarity":null,"before_hash":"5b17b49f0e76aed4133e74cf383457b8","after_hash":"5b17b49f0e76aed4133e74cf383457b8"},{"tool":"cypher_suggest_capability_why","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Offer the Journeyman's read on why a capability exists.","description_similarity":null,"before_hash":"ef1076ad07d8adb39bce405596277177","after_hash":"ef1076ad07d8adb39bce405596277177"},{"tool":"cypher_service_provenance","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Pivot to a service — its capabilities, symbols, and issues.","description_similarity":null,"before_hash":"b904d44a8e4d06a299ebad1a8383a6e4","after_hash":"b904d44a8e4d06a299ebad1a8383a6e4"},{"tool":"cypher_routing_history","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Show which repos have declined an issue and why.","description_similarity":null,"before_hash":"4970e56f595b92777fa02c993fcc929f","after_hash":"4970e56f595b92777fa02c993fcc929f"},{"tool":"cypher_route_rejection","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Route a target's rejection reason back to the origin issue.","description_similarity":null,"before_hash":"28c182453a00658fdaefc0a40fa444bd","after_hash":"28c182453a00658fdaefc0a40fa444bd"},{"tool":"cypher_retire_funding_block","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Retire a stale funding block to a historical record when its item closes.","description_similarity":null,"before_hash":"871001028e38d217ae4ae8e76bc4c96f","after_hash":"871001028e38d217ae4ae8e76bc4c96f"},{"tool":"cypher_register_service","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Register a repo as a Service node in the factory graph.","description_similarity":null,"before_hash":"768486d81ca4fd17cf8b07dca044f676","after_hash":"768486d81ca4fd17cf8b07dca044f676"},{"tool":"cypher_record_triage","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Record the Porter's triage of a GitHub issue.","description_similarity":null,"before_hash":"55d4a544e2d2d1aae2c0405fac94785b","after_hash":"55d4a544e2d2d1aae2c0405fac94785b"},{"tool":"cypher_record_scope","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Record the actionable spec and the code-location method for an issue.","description_similarity":null,"before_hash":"b66a7f61fb883500fafe9695828f449a","after_hash":"b66a7f61fb883500fafe9695828f449a"},{"tool":"cypher_recent_activity","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"List every domain object changed within a date window, across all node types.","description_similarity":null,"before_hash":"92415eda349ce8f71fafc15511bc2afd","after_hash":"92415eda349ce8f71fafc15511bc2afd"},{"tool":"cypher_pr_provenance","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Fetch a PR's fixes and the intentions it enforces for the PR dossier.","description_similarity":null,"before_hash":"6d98c6b3af8c14bf2a7423c3e5076227","after_hash":"6d98c6b3af8c14bf2a7423c3e5076227"},{"tool":"cypher_note_rejection","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Record why the Porter rejected an issue.","description_similarity":null,"before_hash":"a054a3f68e5a1c4d716044600f994fe0","after_hash":"a054a3f68e5a1c4d716044600f994fe0"},{"tool":"cypher_mark_invariant_contradiction","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Mark two invariants as contradictory.","description_similarity":null,"before_hash":"f409ec8f00c5b51466357169c33456a3","after_hash":"f409ec8f00c5b51466357169c33456a3"},{"tool":"cypher_mark_funding_state","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Reflect an LLM-credit outage (or its clearance) in the intention graph.","description_similarity":null,"before_hash":"52a65572335803e03802364f9036523c","after_hash":"52a65572335803e03802364f9036523c"},{"tool":"cypher_list_pull_requests","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"List every mirrored pull request for the Pull Requests register.","description_similarity":null,"before_hash":"bc55f14733f9ff50dbd2c3bd31a5f9f6","after_hash":"bc55f14733f9ff50dbd2c3bd31a5f9f6"},{"tool":"cypher_list_patent_elements","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"List every filed patent reference numeral.","description_similarity":null,"before_hash":"643af1f774031cd2496e0463a5699754","after_hash":"643af1f774031cd2496e0463a5699754"},{"tool":"cypher_list_issues","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"List every triaged issue for the Issues register.","description_similarity":null,"before_hash":"a0a8818ccf60351ce8abe4b05ec1156b","after_hash":"a0a8818ccf60351ce8abe4b05ec1156b"},{"tool":"cypher_list_invariants","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"List every enforceable invariant.","description_similarity":null,"before_hash":"8b7d7125a5cea3284ad655bdc89d0418","after_hash":"8b7d7125a5cea3284ad655bdc89d0418"},{"tool":"cypher_list_capabilities","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"List every capability for semantic intent-matching.","description_similarity":null,"before_hash":"af6cafd64bf9c3ca26720b446e769364","after_hash":"af6cafd64bf9c3ca26720b446e769364"},{"tool":"cypher_link_root_cause","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Point an issue at the code symbol that caused it.","description_similarity":null,"before_hash":"3df4925145d7543e2845c567b01b7dbd","after_hash":"3df4925145d7543e2845c567b01b7dbd"},{"tool":"cypher_link_pr","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Attach the fix PR to its issue via the FIXES edge.","description_similarity":null,"before_hash":"fe97f5f52f6aa9be3a5507bf9cb8a820","after_hash":"fe97f5f52f6aa9be3a5507bf9cb8a820"},{"tool":"cypher_link_issue_to_capability","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Attach an issue to the capability it is about.","description_similarity":null,"before_hash":"76be097727b968c2e9850aac01ee45ca","after_hash":"76be097727b968c2e9850aac01ee45ca"},{"tool":"cypher_link_invariant_to_patent","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Ground an invariant in a patent reference numeral.","description_similarity":null,"before_hash":"31ca03207fb32b4b1c65dca1169f2cf6","after_hash":"31ca03207fb32b4b1c65dca1169f2cf6"},{"tool":"cypher_link_capability_to_patent","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Ground a capability in a patent reference numeral.","description_similarity":null,"before_hash":"4807199075e1ccf1df9f4efee808db1e","after_hash":"4807199075e1ccf1df9f4efee808db1e"},{"tool":"cypher_link_capability_consumer","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Record that a service consumes a capability.","description_similarity":null,"before_hash":"5136b6a6f051da23b615705d45b7aa80","after_hash":"5136b6a6f051da23b615705d45b7aa80"},{"tool":"cypher_issue_provenance","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Fetch an issue's GitHub URLs, fix PRs, and provenance chain for browser click-through.","description_similarity":null,"before_hash":"56055b15167efff1039c07c44b77ff33","after_hash":"56055b15167efff1039c07c44b77ff33"},{"tool":"cypher_invariant_provenance","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Explain an invariant and what it guards.","description_similarity":null,"before_hash":"3f327ddef5eb06d43517c3aacd72b746","after_hash":"3f327ddef5eb06d43517c3aacd72b746"},{"tool":"cypher_index_symbol","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Index a code symbol as belonging to a service.","description_similarity":null,"before_hash":"942d69df2405842e4c3e6652e2837087","after_hash":"942d69df2405842e4c3e6652e2837087"},{"tool":"cypher_guard_invariant_symbol","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Register a symbol an invariant guards.","description_similarity":null,"before_hash":"e29d8b88a03569c0822fc4658f164cd3","after_hash":"e29d8b88a03569c0822fc4658f164cd3"},{"tool":"cypher_find_airline_flights","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Find airline routes between two cities (named-tool smoke test).","description_similarity":null,"before_hash":"1376b6de7be04c881083fa04d5b9ec79","after_hash":"1376b6de7be04c881083fa04d5b9ec79"},{"tool":"cypher_factory_resolution_stats","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Report how issues were located, to measure grep-scope shrinkage.","description_similarity":null,"before_hash":"b290835a1f52fd4eadd647ecc7940d3d","after_hash":"b290835a1f52fd4eadd647ecc7940d3d"},{"tool":"cypher_explain_patent_element","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Show what a patent reference numeral describes.","description_similarity":null,"before_hash":"a7510728e5388be8ab302331828e6fad","after_hash":"a7510728e5388be8ab302331828e6fad"},{"tool":"cypher_explain_capability","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Explain why a capability exists and where it lives.","description_similarity":null,"before_hash":"3c3c00b0962ba27f0f2d8f3944e0de4d","after_hash":"3c3c00b0962ba27f0f2d8f3944e0de4d"},{"tool":"cypher_context_pack","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Return the code-orienteering scope for an intent keyword.","description_similarity":null,"before_hash":"f999f90b067881b8eb3bff531d43b589","after_hash":"f999f90b067881b8eb3bff531d43b589"},{"tool":"cypher_claim_issue","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Mark an issue as actively being worked at the start of an agent's turn.","description_similarity":null,"before_hash":"5ff6f294e5c188964ec27e739d146892","after_hash":"5ff6f294e5c188964ec27e739d146892"},{"tool":"cypher_capability_patents","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Show a capability's patent grounding.","description_similarity":null,"before_hash":"1db82e6558d86e2f1076b991f3a15e7e","after_hash":"1db82e6558d86e2f1076b991f3a15e7e"},{"tool":"cypher_bind_rationale_to_symbol","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Attach the Journeyman's rationale to a specific code symbol.","description_similarity":null,"before_hash":"273aaa8ad9f3ce66a1bfedd4ee941328","after_hash":"273aaa8ad9f3ce66a1bfedd4ee941328"},{"tool":"cypher_bind_capability_to_symbol","kind":"added","observed_at":"2026-09-27T15:18:54.265Z","fields":[],"description_before":null,"description_after":"Attach a capability to one of the symbols that implement it.","description_similarity":null,"before_hash":"189fd1ff321162678514a785362416bb","after_hash":"189fd1ff321162678514a785362416bb"}],"next_before":"125147","next_actions":[{"action":"list_changes","description":"Older changes","href":"/v1/servers/io.github.lonniev%2Fcypher-mcp/changes?before=125147&limit=50"}]}