{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_7zjubshe2ka9","handle":"taxsort-mcp","url":"https://wellknown.network/agents/taxsort-mcp","links":{"self":"https://wellknown.network/agents/taxsort-mcp/record.json","html":"https://wellknown.network/agents/taxsort-mcp","markdown":"https://wellknown.network/agents/taxsort-mcp/record.md","api":"https://wellknown.network/api/v1/agents/taxsort-mcp","status":"https://wellknown.network/api/v1/agents/taxsort-mcp/status","claim":"https://wellknown.network/agents/taxsort-mcp/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/taxsort-mcp/claim.json","badge":"https://wellknown.network/agents/taxsort-mcp/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/taxsort-mcp/history","tools":"https://wellknown.network/api/v1/agents/taxsort-mcp/tools"},"ard":{"identifier":"urn:air:taxsort-mcp.fastmcp.app:server:taxsort-mcp","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"taxsort-mcp","summary":"TaxSort — Tollbooth-monetized MCP server for personal tax transaction classification","description":"TaxSort — Tollbooth-monetized MCP server for personal tax transaction classification","publisher":{"name":"lonniev","url":null},"homepage":null,"repository":"https://github.com/lonniev/taxsort-mcp","version":"0.30.7","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://taxsort-mcp.fastmcp.app/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-08-24T13:57:31.81575Z","publishedAt":"2026-08-24T13:57:31.81575Z","registryName":"io.github.lonniev/taxsort-mcp"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"commerce.payments","name":"Payments","confidence":1,"provenance":"derived"},{"slug":"finance.accounting","name":"Accounting","confidence":1,"provenance":"derived"},{"slug":"finance.banking","name":"Banking","confidence":1,"provenance":"derived"},{"slug":"security.secrets","name":"Secrets Management","confidence":1,"provenance":"derived"},{"slug":"data.database","name":"Databases","confidence":0.992,"provenance":"derived"},{"slug":"dev.version-control","name":"Version Control","confidence":0.992,"provenance":"derived"},{"slug":"content.writing","name":"Writing & Editing","confidence":0.51,"provenance":"derived"},{"slug":"documents.invoice-processing","name":"Invoice Processing","confidence":0.51,"provenance":"derived"}],"categories":["commerce","content","data","dev","documents","finance","security"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 5h ago.","lastOkAt":"2026-10-10T05:30:06.214Z","lastProbedAt":"2026-10-10T05:30:06.214Z","statusComputedAt":"2026-10-10T05:30:52.701Z","reliability30d":{"probes":110,"successRate":1,"p50Ms":431,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":108,"ok":108,"authBoundaryOk":0,"serviceOk":108,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-10T05:30:06.214Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":667,"error":null,"detail":{"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"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 "},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"toolCount":87,"toolsHash":"a86a8ec6685a49153f97d9ebdd432bfd60e6a9f447a43848efa202f144976e7e","serverName":"taxsort-mcp","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.4.7","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T23:29:48.898Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":504,"error":null,"detail":{"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"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 "},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"toolCount":87,"toolsHash":"a86a8ec6685a49153f97d9ebdd432bfd60e6a9f447a43848efa202f144976e7e","serverName":"taxsort-mcp","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.4.7","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T16:33:20.039Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":541,"error":null,"detail":{"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"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 "},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"toolCount":87,"toolsHash":"a86a8ec6685a49153f97d9ebdd432bfd60e6a9f447a43848efa202f144976e7e","serverName":"taxsort-mcp","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.4.7","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T09:26:12.674Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":522,"error":null,"detail":{"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"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 "},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"toolCount":87,"toolsHash":"a86a8ec6685a49153f97d9ebdd432bfd60e6a9f447a43848efa202f144976e7e","serverName":"taxsort-mcp","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.4.7","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T02:27:13.882Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":352,"error":null,"detail":{"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"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 "},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"toolCount":87,"toolsHash":"a86a8ec6685a49153f97d9ebdd432bfd60e6a9f447a43848efa202f144976e7e","serverName":"taxsort-mcp","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.4.7","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T20:24:52.554Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":370,"error":null,"detail":{"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"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 "},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"toolCount":87,"toolsHash":"a86a8ec6685a49153f97d9ebdd432bfd60e6a9f447a43848efa202f144976e7e","serverName":"taxsort-mcp","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.4.7","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T13:22:28.799Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":396,"error":null,"detail":{"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"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 "},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"toolCount":87,"toolsHash":"a86a8ec6685a49153f97d9ebdd432bfd60e6a9f447a43848efa202f144976e7e","serverName":"taxsort-mcp","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.4.7","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T07:25:46.439Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":338,"error":null,"detail":{"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"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 "},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"toolCount":87,"toolsHash":"a86a8ec6685a49153f97d9ebdd432bfd60e6a9f447a43848efa202f144976e7e","serverName":"taxsort-mcp","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.4.7","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T01:22:28.190Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":340,"error":null,"detail":{"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"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 "},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"toolCount":87,"toolsHash":"a86a8ec6685a49153f97d9ebdd432bfd60e6a9f447a43848efa202f144976e7e","serverName":"taxsort-mcp","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.4.7","protocolVersion":"2025-06-18"}},{"at":"2026-10-07T19:24:09.846Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":497,"error":null,"detail":{"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"Create a new operator-owned discount coupon."},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"toolCount":87,"toolsHash":"2f237be807b2ef4cd4148a71c8a6653b20514e367e92ae6fd78cba42d0c4d5b7","serverName":"taxsort-mcp","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.4.7","protocolVersion":"2025-06-18"}}],"tools":[{"name":"taxsort_check_balance","description":"Check a patron's credit balance at this operator.\n\nThis is the patron's spending balance — credits purchased via\nLightning for tool calls at this operator. For "},{"name":"taxsort_purchase_credits","description":"Buy credits via Bitcoin Lightning.\n\nCreates a Lightning invoice. Pay it with any Lightning wallet,\nthen call check_payment to confirm. Proof of npub ownership i"},{"name":"taxsort_check_payment","description":"Check the payment status of a Lightning invoice.\n\nCall after paying the invoice from purchase_credits.\nFree — no credits required. Proof of npub ownership is re"},{"name":"taxsort_restore_credits","description":"Credit a patron's ledger from a BTCPay-settled invoice.\n\n**RESTRICTED to the operator** — the operator owns the books and is\nthe only party who can issue a manu"},{"name":"taxsort_account_statement","description":"Generate a patron's account statement at this operator.\n\nReturns the patron's purchase history, active credit tranches,\nper-tool usage breakdown, and recent dai"},{"name":"taxsort_account_statement_infographic","description":"Generate a visual SVG infographic of your account statement.\n\nReturns the same data as account_statement, rendered as a dark-themed\nSVG graphic with balance her"},{"name":"taxsort_report_issue","description":"File a field report about this service as a GitHub issue on the operator's repo.\n\nFound a tool's metadata or response wrong or confusing? Report it where the to"},{"name":"taxsort_service_status","description":"Check the health and configuration of this service. Free."},{"name":"taxsort_get_operator_onboarding_status","description":"Report this operator's configuration readiness.\n\nShows which operator settings are configured, which are missing,\nand how to deliver each missing value. For pat"},{"name":"taxsort_get_patron_onboarding_status","description":"Report a patron's credential readiness for this operator.\n\nFor set-once services (eXcalibur, TheBrain), shows which patron\nsecrets are configured and which are "},{"name":"taxsort_session_status","description":"Check operator readiness. Returns the operator lifecycle\nstate and clear guidance on what to do next. Free.\n\nLifecycle states:\n- ready: Vault AND pricing model "},{"name":"taxsort_request_credential_channel","description":"Open a Secure Courier channel for credential delivery.\n\nThis is the CREDENTIAL-DELIVERY flow — use it to hand over a service\nsecret (API keys, tokens). To merel"},{"name":"taxsort_receive_credentials","description":"Pick up credentials from the Secure Courier.\n\nCompletes the CREDENTIAL-DELIVERY flow (the ownership-proof\ncounterpart is ``receive_npub_proof``).\n\n**Call this o"},{"name":"taxsort_forget_credentials","description":"Delete vaulted credentials for a specific service and npub.\n\nFor operator credentials, pass the operator's own npub. For patron\ncredentials, pass the patron's n"},{"name":"taxsort_update_patron_credential","description":"Add or update a single patron credential field.\n\nMerges into existing stored credentials without affecting\nother fields. Useful for setting an account identifie"},{"name":"taxsort_update_operator_credential","description":"Add or update a single operator secret field.\n\nMerges into the operator's stored credentials without touching the\nothers — the field-level counterpart to re-del"},{"name":"taxsort_delete_patron_credential","description":"Remove a single patron credential field.\n\nDeletes one field from stored credentials without affecting\nother fields. Free. Proof of npub ownership is required —\n"},{"name":"taxsort_delete_operator_credential","description":"Remove a single operator secret field.\n\nDeletes one key from the operator's encrypted credential blob without\ntouching the others — the field-level counterpart "},{"name":"taxsort_get_patron_credential_fields","description":"List stored patron credential field names (not values).\n\nReturns the names of fields stored for a patron, plus each\nfield's ``delivered_at`` ISO-8601 timestamp "},{"name":"taxsort_request_npub_proof","description":"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 c"},{"name":"taxsort_receive_npub_proof","description":"Receive npub ownership confirmation from a patron.\n\nCompletes the npub-OWNERSHIP-PROOF flow (the credential-delivery\ncounterpart is ``receive_credentials``).\n\n*"},{"name":"taxsort_check_proof_status","description":"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"},{"name":"taxsort_oracle_how_to_join","description":"Get DPYC onboarding instructions from the Oracle. Free."},{"name":"taxsort_oracle_get_tax_rate","description":"Get the current DPYC certification tax rate. Free."},{"name":"taxsort_oracle_lookup_member","description":"Look up a DPYC community member by npub. Free."},{"name":"taxsort_oracle_about","description":"Describe the DPYC ecosystem via the Oracle. Free."},{"name":"taxsort_oracle_network_advisory","description":"Get active network advisories from the Oracle. Free."},{"name":"taxsort_check_authority_balance","description":"Check this operator's tax balance at the Authority.\n\nReturns the sats available for certifying patron credit purchases.\nWhen this balance reaches zero, patron t"},{"name":"taxsort_get_pricing_model","description":"Get the active pricing model for this operator. Free.\n\nIf no model exists, self-initializes a scaffold with all\nregistered tools at 0 sats.  No economic data fr"},{"name":"taxsort_set_pricing_model","description":"Set the active pricing model. RESTRICTED to operator.\n\nRequires a valid proof (Schnorr-signed kind-27235 event)\nproving the caller holds the operator's nsec."},{"name":"taxsort_reset_pricing_model","description":"Erase all pricing models and restore a viable default.\n\nDeletes every stored model, then self-initializes a fresh one\nfrom the tool registry — all tools at 0 sa"},{"name":"taxsort_request_adoption","description":"Ask a chosen Authority to adopt this operator (deferred courtship).\n\nRESTRICTED to the operator — requires proof the caller controls this\noperator's npub. Resol"},{"name":"taxsort_adoption_status","description":"Check this operator's adoption-request status at a chosen Authority.\n\nFree. Polls the Authority MCP-to-MCP for the status of this operator's\nrequest (pending / "},{"name":"taxsort_restore_neon_schema","description":"Prepare this operator's database schema again, ignoring the breadcrumb.\n\nDiagnostic / recovery tool for when Neon keeps answering 4xx and the\noperator suspects "},{"name":"taxsort_list_canonical_identities","description":"Return canonical (tool_id, mcp_name, …) for every tool the wheel exposes.\n\nThe authoritative source for any client (Studio, agents, FE)\nthat needs to know how t"},{"name":"taxsort_get_nostr_profile","description":"Read an npub's public Nostr profile (NIP-01 kind-0 metadata).\n\nFree, no proof — the data is already public on relays. Returns the\nlatest metadata fields (name, "},{"name":"taxsort_publish_nostr_profile","description":"Publish a CLIENT-SIGNED kind-0 profile to relays for an npub.\n\nThe wheel never holds a patron nsec. The frontend signs the kind-0\nmetadata event with the patron"},{"name":"taxsort_check_price","description":"Preview the effective cost of a tool call.\n\nShows the base cost and any constraint effects (discounts, free\ntrials, surge pricing). Free — no credits required."},{"name":"taxsort_list_constraint_types","description":"List all available constraint types and their parameter schemas.\n\nReturns the type, category, description, and parameter specs for\nevery constraint that can be "},{"name":"taxsort_mint_coupon","description":"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 "},{"name":"taxsort_list_coupons","description":"List every coupon this operator has minted (newest first).\n\nEach row carries the current ``times_redeemed`` counter — the\nStudio renders a progress bar from thi"},{"name":"taxsort_update_coupon","description":"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``"},{"name":"taxsort_delete_coupon","description":"Delete a coupon.  Cascades to all patron redemptions.\n\nAny chain step referencing the deleted coupon_id becomes a\nno-op (the constraint returns neutral on unkno"},{"name":"taxsort_redeem_coupon","description":"Claim a coupon by its name (the code the operator shared).\n\nLooks up the operator's coupon by ``code``, validates the window\nand total cap, and records a per-pa"},{"name":"taxsort_list_my_coupons","description":"List the coupons this patron has redeemed on this operator.\n\nReturns both active and exhausted redemptions with a per-row\n``status`` (``active`` / ``window_clos"},{"name":"taxsort_forget_coupon","description":"Remove a coupon from this patron's redemption list.\n\nCosmetic only — the coupon itself still exists at the operator,\nand the patron can re-redeem the same code "},{"name":"taxsort_notarize_ledger","description":"Build a Merkle tree of all patron balances and submit the root\nto Bitcoin via OpenTimestamps.\n\nOperator-only background task. Bitcoin confirmation takes 1-6 hou"},{"name":"taxsort_get_notarization_proof","description":"Generate a Merkle inclusion proof that a patron's balance was\nincluded in a Bitcoin-notarized snapshot."},{"name":"taxsort_list_notarizations","description":"List recent Bitcoin notarization records."},{"name":"taxsort_verify_passphrase","description":"Verify a passphrase to unlock a timed-out session."},{"name":"taxsort_create_session","description":"Create a new TaxSort session for a tax year."},{"name":"taxsort_get_session","description":"Get session details and summary stats."},{"name":"taxsort_list_sessions","description":"List all sessions owned by the current patron."},{"name":"taxsort_import_csv","description":"Import a CSV file into a session. Content is the raw CSV text. Optional account_name overrides the filename-derived account."},{"name":"taxsort_get_import_stats","description":"Get import statistics for a session."},{"name":"taxsort_get_transactions","description":"Get transactions for a session with optional filters.\n\nReturns raw transactions LEFT JOINed with their classifications.\nUse unclassified_only=true to fetch page"},{"name":"taxsort_get_transactions_paged","description":"Server-side filtered, grouped, sorted, paginated transactions.\n\ngroup_sort controls the order of groups (A-Z vs Z-A).\nsort_col + sort_dir control row order with"},{"name":"taxsort_save_classifications","description":"Bulk write classifications from the FE.\n\nclassifications is a JSON array of objects, each with:\n  - id: raw_transaction_id\n  - category, subcategory (required)\n"},{"name":"taxsort_delete_classification","description":"Remove a classification, reverting the transaction to unclassified."},{"name":"taxsort_clear_transactions","description":"Delete all transactions and classifications for a session, so CSVs can be re-imported."},{"name":"taxsort_delete_account_transactions","description":"Delete all transactions and classifications for a specific imported account."},{"name":"taxsort_reset_classifications","description":"Delete all classifications but keep the imported transactions."},{"name":"taxsort_get_amount_neighbors","description":"Fetch transactions with the same amount within ±days of a date. Used by the classifier to detect duplicates from overlapping CSV imports."},{"name":"taxsort_get_accounts","description":"List all accounts in this session with their types and transaction counts."},{"name":"taxsort_set_account_type","description":"Set an account's type: bank (checking/savings), card (credit/debit), investment, or loan."},{"name":"taxsort_get_summary","description":"Get a grouped spending summary for tax reporting."},{"name":"taxsort_get_rules","description":"Get all classification rules for the current patron."},{"name":"taxsort_save_rule","description":"Create a classification rule.\n\nProvide description_pattern (regex matched case-insensitively against\nthe transaction description), category, and subcategory. Op"},{"name":"taxsort_delete_rule","description":"Delete a classification rule by ID."},{"name":"taxsort_apply_rules","description":"Apply rules to unclassified transactions in a session."},{"name":"taxsort_count_rule_matches","description":"Count how many transactions match a rule pattern (live preview)."},{"name":"taxsort_get_custom_categories","description":"Get custom categories defined by this user."},{"name":"taxsort_save_custom_category","description":"Add a custom category/subcategory (e.g. Personal / Auto Gas)."},{"name":"taxsort_delete_custom_category","description":"Delete a custom category."},{"name":"taxsort_create_share_token","description":"Create a share token so another user can access this session."},{"name":"taxsort_load_share_token","description":"Load a shared session via a share token."},{"name":"taxsort_get_github_token","description":"Get the GitHub token for creating issues in the taxsort-mcp repo."},{"name":"taxsort_get_anthropic_key","description":"Get the Anthropic API key for FE-driven classification."},{"name":"taxsort_report_api_usage","description":"Report Anthropic API usage from FE classification for cost tracking."},{"name":"taxsort_get_api_usage_stats","description":"Get aggregated API usage statistics for cost analysis."},{"name":"taxsort_create_feedback_issue","description":"Create a GitHub issue for bug reports, feature requests, or feedback."},{"name":"taxsort_list_feedback_issues","description":"List feedback issues submitted by this patron."},{"name":"taxsort_session_heartbeat","description":"Presence heartbeat. Returns who else is active in this session."},{"name":"taxsort_ask_advisor","description":"Ask the Financial Advisor about using TaxSort."},{"name":"taxsort_ask_tax_researcher","description":"Ask the Tax Code Researcher about IRS provisions."},{"name":"taxsort_request_unlock","description":"Request a session unlock after timeout."},{"name":"taxsort_check_unlock","description":"Check if the unlock response is valid."}],"package":null,"toolSurface":{"id":"ts_ukxb9e6mbq4d","endpointId":"ep_gdpqq6fkgs6r","hash":"a86a8ec6685a49153f97d9ebdd432bfd60e6a9f447a43848efa202f144976e7e","toolCount":87,"serverName":"taxsort-mcp","serverVersion":"3.4.7","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-08T01:22:28.200Z","lastSeenAt":"2026-10-10T05:30:06.206Z","observations":9,"toolNames":["taxsort_check_balance","taxsort_purchase_credits","taxsort_check_payment","taxsort_restore_credits","taxsort_account_statement","taxsort_account_statement_infographic","taxsort_report_issue","taxsort_service_status","taxsort_get_operator_onboarding_status","taxsort_get_patron_onboarding_status","taxsort_session_status","taxsort_request_credential_channel","taxsort_receive_credentials","taxsort_forget_credentials","taxsort_update_patron_credential","taxsort_update_operator_credential","taxsort_delete_patron_credential","taxsort_delete_operator_credential","taxsort_get_patron_credential_fields","taxsort_request_npub_proof","taxsort_receive_npub_proof","taxsort_check_proof_status","taxsort_oracle_how_to_join","taxsort_oracle_get_tax_rate","taxsort_oracle_lookup_member","taxsort_oracle_about","taxsort_oracle_network_advisory","taxsort_check_authority_balance","taxsort_get_pricing_model","taxsort_set_pricing_model","taxsort_reset_pricing_model","taxsort_request_adoption","taxsort_adoption_status","taxsort_restore_neon_schema","taxsort_list_canonical_identities","taxsort_get_nostr_profile","taxsort_publish_nostr_profile","taxsort_check_price","taxsort_list_constraint_types","taxsort_mint_coupon","taxsort_list_coupons","taxsort_update_coupon","taxsort_delete_coupon","taxsort_redeem_coupon","taxsort_list_my_coupons","taxsort_forget_coupon","taxsort_notarize_ledger","taxsort_get_notarization_proof","taxsort_list_notarizations","taxsort_verify_passphrase","taxsort_create_session","taxsort_get_session","taxsort_list_sessions","taxsort_import_csv","taxsort_get_import_stats","taxsort_get_transactions","taxsort_get_transactions_paged","taxsort_save_classifications","taxsort_delete_classification","taxsort_clear_transactions","taxsort_delete_account_transactions","taxsort_reset_classifications","taxsort_get_amount_neighbors","taxsort_get_accounts","taxsort_set_account_type","taxsort_get_summary","taxsort_get_rules","taxsort_save_rule","taxsort_delete_rule","taxsort_apply_rules","taxsort_count_rule_matches","taxsort_get_custom_categories","taxsort_save_custom_category","taxsort_delete_custom_category","taxsort_create_share_token","taxsort_load_share_token","taxsort_get_github_token","taxsort_get_anthropic_key","taxsort_report_api_usage","taxsort_get_api_usage_stats","taxsort_create_feedback_issue","taxsort_list_feedback_issues","taxsort_session_heartbeat","taxsort_ask_advisor","taxsort_ask_tax_researcher","taxsort_request_unlock","taxsort_check_unlock"],"distinctSurfaces":5},"endpointFacts":[{"id":"ep_gdpqq6fkgs6r","url":"https://taxsort-mcp.fastmcp.app/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-09T09:26:12.687Z","auth":{"observedAt":"2026-10-09T09:26:13.178Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-10-09T09:26:13.186Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"*.fastmcp.app","issuer":{"commonName":"Amazon RSA 2048 M04","organization":"Amazon"},"validFrom":"2026-06-17T00:00:00.000Z","validTo":"2026-12-31T23:59:59.000Z","daysToExpiry":82,"sanCount":1,"fingerprint256":"0C:7C:51:5D:D9:FD:62:86:F7:4C:72:2E:19:AC:51:32:03:15:C0:75:12:A7:47:66:6B:15:9F:40:7E:D8:17:DC"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"io.github.lonniev/taxsort-mcp","url":"https://registry.modelcontextprotocol.io/v0/servers/io.github.lonniev%2Ftaxsort-mcp","firstSeenAt":"2026-09-06T18:19:25.596Z","fetchedAt":"2026-10-07T16:20:37.578Z","normalizedAt":"2026-10-07T16:20:37.578Z"}]},"firstSeenAt":"2026-09-06T18:19:25.596Z","updatedAt":"2026-10-10T05:32:06.115Z"}