Koskamo

NAIF Gravity MCP Diagnostics

A community diagnostic tool for MCP servers that helps agents troubleshoot handshake failures, transport issues, and schema problems. It offers free scope guides and bounded paid diagnostics for API shape analysis and automation rescue, supporting developers in resolving integration errors without automatic external spending.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

NAIF Gravity MCP Diagnostics logo, by NAIF GravityCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by NAIF Gravity
MCP endpoint (Streamable HTTP)
https://naifgravity.com/mcp
Vendor documentation

What its tools do

5 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

5 of 5 have a description · 5 of 5 declare behavior hints · 5 of 5 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Diagnose MCP handshake and tools/list failures
  • Analyze API response shape changes
  • Repair webhook field mapping issues
  • Validate JSON syntax and structure

Source and maintenance

Community listingRegistry 1.7.2
Maintenance checked

Protocol and capabilities

Server
naif-fixgraph 1.7.0
MCP protocol negotiated in check
2025-11-25
Tools
5 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Public flow for new MCP clients: diagnose_issue → quote_repair → prepare_repair → verify_repair. For an owner-authorized wallet with a per-purchase cap, request_delegated_purchase may be used directly for the four listed micro-services to create quote + acceptance + Base USDC checkout in one call. It never signs or sends funds; the caller wallet remains the payment authority. Diagnosis is free; quote is non-binding; verify_repair checks an existing payer-completed payment action. Any commercial job remains gated by PAYMENT_VERIFIED and the existing storefront job policy. Legacy tool names remain callable for backward compatibility but are intentionally not advertised. Do not claim a fix or payment until verified.

Tools

5 advertised

diagnose_issue — Diagnose Issue
Advertised by the server during the last successful anonymous check.
Open-world

Start here. Diagnose one sanitized MCP, API, webhook, agent or integration failure for free. Returns bounded evidence plus a suggested repair service, then use quote_repair only if a priced repair is wanted. It never creates a quote, checkout, payment or repair job. It may record bounded operational attribution/telemetry, so readOnlyHint is false; it does not modify the caller system or commercial state.

diagnose_issue input schema
{
  "type": "object",
  "required": [
    "problem"
  ],
  "properties": {
    "source": {
      "type": "string",
      "maxLength": 80,
      "description": "Optional attribution label for the calling agent or integration; omit when no stable source label is available."
    },
    "problem": {
      "type": "string",
      "maxLength": 3000,
      "minLength": 3,
      "description": "One sanitized technical symptom. Include the affected component and observable error/status. Never include secrets, credentials, private keys or PII."
    }
  },
  "additionalProperties": false
}
diagnose_issue output schema
{
  "type": "object",
  "properties": {
    "free": {
      "type": "boolean",
      "description": "True for this free diagnostic step."
    },
    "error": {
      "type": "string",
      "description": "Present when a bounded diagnosis could not be produced."
    },
    "phase": {
      "type": "string",
      "description": "DIAGNOSE on a successful bounded diagnosis."
    },
    "nextTool": {
      "type": "string",
      "description": "quote_repair when the caller wants a priced bounded repair."
    },
    "automaticQuote": {
      "type": "boolean",
      "description": "False; diagnosis never creates a quote automatically."
    },
    "rawInputStored": {
      "type": "boolean",
      "description": "False when the raw diagnostic input is not retained as payload data."
    },
    "automaticPayment": {
      "type": "boolean",
      "description": "False; diagnosis never sends or charges payment."
    },
    "automaticCheckout": {
      "type": "boolean",
      "description": "False; diagnosis never creates checkout automatically."
    },
    "automaticExecution": {
      "type": "boolean",
      "description": "False; diagnosis never starts repair execution."
    },
    "suggestedProductId": {
      "type": "string",
      "description": "Public repair product suggested from the diagnosis when available."
    }
  },
  "description": "Bounded diagnosis result. On success phase is DIAGNOSE and nextTool is quote_repair; an error field indicates diagnosis was unavailable.",
  "additionalProperties": true
}
diagnose_issue annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
quote_repair — Quote Repair
Advertised by the server during the last successful anonymous check.

Use only after diagnose_issue when the caller wants a priced bounded repair. Creates a new non-binding quote for the selected or automatically matched public service. Repeating the call may create a different quoteId, so it is intentionally non-idempotent. It does not accept the quote, create checkout, send payment or start execution. If the quote is accepted by the caller, pass its quoteId and one offered payment rail to prepare_repair.

quote_repair input schema
{
  "type": "object",
  "required": [
    "description"
  ],
  "properties": {
    "source": {
      "type": "string",
      "maxLength": 80,
      "description": "Optional attribution label for the calling agent or integration."
    },
    "productId": {
      "type": "string",
      "maxLength": 100,
      "minLength": 3,
      "description": "Optional exact public productId suggested by diagnose_issue or chosen from the catalog. Omit to let NAIF match the closest service."
    },
    "description": {
      "type": "string",
      "maxLength": 2000,
      "minLength": 8,
      "description": "Sanitized bounded repair need derived from diagnose_issue; describe the failure and desired repair outcome without secrets or PII."
    }
  },
  "additionalProperties": false
}
quote_repair output schema
{
  "type": "object",
  "properties": {
    "eta": {
      "description": "Estimated delivery time or service ETA when available."
    },
    "error": {
      "type": "string",
      "description": "Present when the requested service is unavailable or commerce could not create a quote."
    },
    "phase": {
      "type": "string",
      "description": "QUOTE on a successful quote."
    },
    "price": {
      "description": "Commercial price returned by the quote service."
    },
    "state": {
      "type": "string",
      "description": "Current quote state returned by commerce."
    },
    "quoteId": {
      "type": "string",
      "description": "Unique non-binding quote identifier to pass to prepare_repair after explicit caller acceptance."
    },
    "currency": {
      "type": "string",
      "description": "Quote currency."
    },
    "nextTool": {
      "type": "string",
      "description": "prepare_repair after explicit caller acceptance."
    },
    "productId": {
      "type": "string",
      "description": "Matched public repair product identifier."
    },
    "exactAmount": {
      "description": "Exact settlement amount when the selected payment design requires one; preserve it exactly as returned."
    },
    "productName": {
      "type": "string",
      "description": "Human-readable matched repair service name."
    },
    "automaticJob": {
      "type": "boolean",
      "description": "False; this tool never starts a repair job."
    },
    "paymentRails": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Rail identifier to pass as prepare_repair.rail."
          }
        },
        "additionalProperties": true
      },
      "description": "Payment rail descriptors offered for this quote; pass one descriptor id to prepare_repair.rail."
    },
    "quoteAccepted": {
      "type": "boolean",
      "description": "False; creating a quote does not accept it."
    },
    "checkoutCreated": {
      "type": "boolean",
      "description": "False; creating a quote does not create checkout."
    },
    "commercialState": {
      "type": "string",
      "description": "Commercial lifecycle state when available."
    },
    "automaticPayment": {
      "type": "boolean",
      "description": "False; this tool never sends or charges payment."
    },
    "automaticExecution": {
      "type": "boolean",
      "description": "False; this tool never starts repair execution."
    }
  },
  "description": "Non-binding repair quote. A successful result includes quoteId, price/currency, offered paymentRails and nextTool=prepare_repair. An error field indicates no quote was created.",
  "additionalProperties": true
}
quote_repair annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
prepare_repair — Prepare Repair
Advertised by the server during the last successful anonymous check.

Use ONLY for the normal repair flow after quote_repair has already returned a quoteId and the caller explicitly chooses that existing quote. This tool does not create a quote: with confirm=true it records acceptance of that quote and creates checkout instructions on exactly one rail offered by it. Do NOT use this tool for owner/platform-preauthorized autonomous purchasing where the agent is allowed to choose one of the four capped micro-services and create its own quote; use request_delegated_purchase for that separate flow. APPLE_PAY returns a human handoff URL for buyer authorization; BASE_USDC and TRON_USDT return payer transfer instructions. It never sends funds, charges the caller, verifies payment or directly starts repair execution. After the buyer completes the required payment action, use verify_repair with the returned checkoutId and the same rail.

prepare_repair input schema
{
  "type": "object",
  "required": [
    "quoteId",
    "confirm",
    "rail"
  ],
  "properties": {
    "rail": {
      "enum": [
        "APPLE_PAY",
        "BASE_USDC",
        "TRON_USDT"
      ],
      "type": "string",
      "description": "Choose exactly one id from the descriptors in quote_repair.paymentRails. Saudi quotes normally offer APPLE_PAY only."
    },
    "source": {
      "type": "string",
      "maxLength": 80,
      "description": "Optional attribution label for the calling agent or integration."
    },
    "confirm": {
      "type": "boolean",
      "const": true,
      "description": "Must be true to record explicit acceptance before checkout instructions are created."
    },
    "quoteId": {
      "type": "string",
      "maxLength": 128,
      "minLength": 8,
      "description": "Exact quoteId returned by quote_repair and explicitly accepted by the caller."
    }
  },
  "additionalProperties": false
}
prepare_repair output schema
{
  "type": "object",
  "properties": {
    "rail": {
      "type": "string",
      "description": "Selected payment rail."
    },
    "error": {
      "type": "string",
      "description": "Present when quote acceptance or checkout preparation failed."
    },
    "phase": {
      "type": "string",
      "description": "PREPARE_REPAIR on success."
    },
    "quoteId": {
      "type": "string",
      "description": "Accepted quote identifier."
    },
    "checkout": {
      "type": "object",
      "description": "Checkout record/instructions returned for the selected rail; includes the checkout identifier used by verify_repair.",
      "additionalProperties": true
    },
    "nextTool": {
      "type": "string",
      "description": "verify_repair after the buyer completes the payment action."
    },
    "fundsSent": {
      "type": "boolean",
      "description": "False; this tool does not send funds."
    },
    "nextAction": {
      "type": "object",
      "description": "For APPLE_PAY, human handoff information; for wallet rails, payer transfer instructions.",
      "additionalProperties": true
    },
    "automaticJob": {
      "type": "boolean",
      "description": "False; this preparation step does not start a repair job."
    },
    "paymentVerified": {
      "type": "boolean",
      "description": "False until verify_repair confirms an existing payment."
    },
    "quoteAcceptance": {
      "type": "object",
      "description": "Commerce acknowledgement that the quote was accepted.",
      "additionalProperties": true
    },
    "automaticPayment": {
      "type": "boolean",
      "description": "False; no automatic charge or transfer occurs."
    },
    "automaticExecution": {
      "type": "boolean",
      "description": "False; this preparation step does not directly execute repair."
    }
  },
  "description": "Accepted quote plus checkout instructions. A successful result includes checkout information and nextTool=verify_repair; no funds are sent by this tool.",
  "additionalProperties": true
}
prepare_repair annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
request_delegated_purchase — Delegated Purchase (Capped)
Advertised by the server during the last successful anonymous check.

Use ONLY for an owner/platform-preauthorized autonomous purchase of one of four supported micro-services under an explicit spending cap. Unlike prepare_repair, this tool does not consume an existing quoteId: it creates its own quote, accepts it, and creates checkout within the delegation. Repeating the call may create a new quote/checkout, so it is intentionally non-idempotent. Do NOT use it when quote_repair already produced a quoteId or for general repair services outside the four listed micro-services; use prepare_repair for an existing repair quote. Supports wallet rails and APPLE_PAY_AUTO. APPLE_PAY_AUTO requires one human Apple Pay approval first; when Tap returns an ACTIVE saved-card payment agreement, later purchases may be charged only within the stored cap. If provider support or authorization is missing, the flow fails closed.

request_delegated_purchase input schema
{
  "type": "object",
  "required": [
    "productId",
    "description",
    "authorizedMerchant",
    "maxAmountUsd",
    "authorizeCheckout"
  ],
  "properties": {
    "source": {
      "type": "string",
      "maxLength": 80,
      "description": "Optional attribution label for the calling agent or integration."
    },
    "productId": {
      "enum": [
        "json-validity-check",
        "api-response-shape-check",
        "json-normalizer",
        "csv-schema-audit"
      ],
      "type": "string",
      "description": "Exactly one of the four services allowed for delegated purchase. For any other repair service, use diagnose_issue → quote_repair → prepare_repair."
    },
    "description": {
      "type": "string",
      "maxLength": 2000,
      "minLength": 8,
      "description": "Sanitized bounded work description for the delegated micro-service; never include secrets, credentials or private keys."
    },
    "paymentRail": {
      "enum": [
        "AUTO",
        "BASE_USDC",
        "TRON_USDT",
        "APPLE_PAY_AUTO"
      ],
      "type": "string",
      "description": "Delegated-purchase rail policy. AUTO chooses an eligible wallet rail; APPLE_PAY_AUTO uses or establishes the capped Tap authorization. This is not the manual rail selection for prepare_repair."
    },
    "maxAmountUsd": {
      "type": "number",
      "maximum": 5,
      "description": "Owner/platform per-purchase spending cap in USD-equivalent. The quote must fit inside this cap and the service launch price.",
      "exclusiveMinimum": 0
    },
    "dailyLimitUsd": {
      "type": "number",
      "maximum": 20,
      "description": "Requested daily APPLE_PAY_AUTO cap used only during first-time authorization setup; maximum 20 USD.",
      "exclusiveMinimum": 0
    },
    "authorizeCheckout": {
      "type": "boolean",
      "const": true,
      "description": "Explicit permission for this tool to create its own quote, accept it, and create checkout within the supplied cap. If a quoteId already exists, use prepare_repair instead."
    },
    "authorizedMerchant": {
      "type": "string",
      "const": "naifgravity.com",
      "description": "Merchant scope explicitly authorized by the owner/platform for this delegated purchase flow."
    },
    "applePayAuthorizationToken": {
      "type": "string",
      "maxLength": 240,
      "minLength": 20,
      "description": "Opaque token returned by the one-time APPLE_PAY_AUTO setup. Supply only a token from this delegated authorization flow; never provide card data or raw Apple Pay payloads."
    }
  },
  "additionalProperties": false
}
request_delegated_purchase output schema
{
  "type": "object",
  "properties": {
    "job": {
      "description": "Repair/delivery job attached by the existing verified-payment workflow when available; may be null."
    },
    "error": {
      "type": "string",
      "description": "Fail-closed error code when delegation, price, provider authorization, quote, checkout, or payment requirements are not satisfied."
    },
    "state": {
      "type": "string",
      "description": "Provider/checkout state when returned."
    },
    "status": {
      "type": "string",
      "description": "Delegated-purchase state such as PAYMENT_REQUIRED, ONE_TIME_APPLE_PAY_AUTHORIZATION_REQUIRED, APPLE_PAY_AUTHORIZATION_NOT_ACTIVE, or a provider payment state."
    },
    "details": {
      "description": "Bounded provider/commerce error details when available."
    },
    "quoteId": {
      "type": "string",
      "description": "Quote created by this delegated call. It was not supplied by the caller."
    },
    "nextTool": {
      "type": "string",
      "description": "For wallet rails, verify_checkout_payment after the payer submits the exact transfer."
    },
    "verified": {
      "type": "boolean",
      "description": "When returned by the provider flow, true only for a verified payment."
    },
    "paymentId": {
      "type": "string",
      "description": "Verified payment identifier when returned by the provider flow."
    },
    "productId": {
      "type": "string",
      "description": "One of the four delegated micro-service product identifiers."
    },
    "checkoutId": {
      "type": "string",
      "description": "Checkout created by this delegated call when quote creation/acceptance succeeded."
    },
    "payerAction": {
      "type": "string",
      "description": "Required human/payer action before payment can be considered complete."
    },
    "paymentRail": {
      "enum": [
        "BASE_USDC",
        "TRON_USDT",
        "APPLE_PAY_AUTO"
      ],
      "type": "string",
      "description": "Rail actually selected for this delegated purchase."
    },
    "automaticJob": {
      "type": "boolean",
      "description": "False when no verified-payment job has been attached yet."
    },
    "authorization": {
      "type": "object",
      "description": "APPLE_PAY_AUTO authorization setup/status information, potentially including the one-time human authorization URL/token. Never interpret this object alone as payment success.",
      "additionalProperties": true
    },
    "automaticQuote": {
      "type": "boolean",
      "description": "True when this tool created the delegated quote itself."
    },
    "automaticPayment": {
      "type": "boolean",
      "description": "False for wallet flows and authorization setup; may only become provider-driven within a previously ACTIVE APPLE_PAY_AUTO agreement."
    },
    "automaticCheckout": {
      "type": "boolean",
      "description": "True when this tool created checkout under the delegation."
    },
    "nextToolArguments": {
      "type": "object",
      "description": "Suggested verification arguments for the wallet checkout; txHash remains caller-supplied after payment.",
      "additionalProperties": true
    },
    "automaticExecution": {
      "type": "boolean",
      "description": "False until the existing post-payment workflow has verified payment; this tool does not execute unpaid work."
    },
    "automaticAcceptance": {
      "type": "boolean",
      "description": "True when the delegated quote was automatically accepted under explicit owner/platform authorization."
    },
    "paymentInstructions": {
      "type": "object",
      "description": "Wallet transfer instructions for an existing delegated checkout; the tool does not send the transfer.",
      "additionalProperties": true
    },
    "delegatedAuthorization": {
      "type": "object",
      "description": "Echo of the enforced merchant/spending delegation, including cap and whether quote acceptance/checkout creation were authorized.",
      "additionalProperties": true
    }
  },
  "description": "Result of a capped delegated purchase attempt. For wallet rails, success creates and accepts a quote plus checkout and returns PAYMENT_REQUIRED with payer instructions; payment itself remains external. For APPLE_PAY_AUTO, first use may return ONE_TIME_APPLE_PAY_AUTHORIZATION_REQUIRED with human authorization data, while a later call with an ACTIVE authorization token may return provider payment-verification fields. Treat error or a non-confirmed status as not paid. This schema describes the delegated flow only; normal existing-quote repairs use prepare_repair.",
  "additionalProperties": true
}
request_delegated_purchase annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
verify_repair — Verify Repair Payment
Advertised by the server during the last successful anonymous check.
Open-world

Use after the buyer completes the payment action for a checkout created by prepare_repair. APPLE_PAY verifies the existing Tap charge by checkoutId; BASE_USDC and TRON_USDT require the payer-provided txHash. A confirmed payment returns verified=true, while an already-confirmed Apple Pay checkout may return alreadyVerified=true; an unconfirmed or rejected payment returns error and/or reason without fabricating success. Verification may also return the job attached by the existing payment-completion workflow. This tool never creates or sends a transaction and never charges the buyer.

verify_repair input schema
{
  "type": "object",
  "required": [
    "checkoutId",
    "rail"
  ],
  "properties": {
    "rail": {
      "enum": [
        "APPLE_PAY",
        "BASE_USDC",
        "TRON_USDT"
      ],
      "type": "string",
      "description": "Use the same payment rail selected in prepare_repair."
    },
    "txHash": {
      "type": "string",
      "pattern": "^(0x)?[0-9a-fA-F]{64}$",
      "description": "Payer-provided transaction hash. Required for BASE_USDC and TRON_USDT after transfer submission; omit for APPLE_PAY."
    },
    "checkoutId": {
      "type": "string",
      "pattern": "^[a-zA-Z0-9_-]{8,128}$",
      "description": "Exact checkout ID returned by prepare_repair."
    }
  },
  "additionalProperties": false
}
verify_repair output schema
{
  "type": "object",
  "properties": {
    "job": {
      "description": "Existing repair job attached by the payment-completion workflow when available; may be null."
    },
    "rail": {
      "type": "string",
      "description": "Payment rail checked."
    },
    "error": {
      "type": "string",
      "description": "Present when payment is missing, unavailable, invalid or could not be verified."
    },
    "phase": {
      "type": "string",
      "description": "VERIFY when the verification route returned a structured result."
    },
    "state": {
      "type": "string",
      "description": "Payment/checkout state when returned; PAYMENT_VERIFIED denotes a confirmed payment."
    },
    "reason": {
      "type": "string",
      "description": "Verification evidence or rejection reason when returned by a wallet rail."
    },
    "verified": {
      "type": "boolean",
      "description": "True only when the provider/chain evidence confirms the expected payment for this checkout."
    },
    "paymentId": {
      "type": "string",
      "description": "Recorded verified payment identifier when available."
    },
    "checkoutId": {
      "type": "string",
      "description": "Checkout identifier that was verified."
    },
    "alreadyVerified": {
      "type": "boolean",
      "description": "True when an APPLE_PAY checkout had already been verified previously."
    }
  },
  "description": "Verification status for an existing checkout payment. Treat verified=true or alreadyVerified=true as confirmed; otherwise inspect error/reason/state and do not assume payment success.",
  "additionalProperties": true
}
verify_repair annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1520 ms
95th percentile latency
1520 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1520 ms · metadata changed · 5 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http naif-gravity-mcp-diagnostics https://naifgravity.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add naif-gravity-mcp-diagnostics --url https://naifgravity.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable naif-gravity-mcp-diagnostics in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "naif-gravity-mcp-diagnostics": {
      "url": "https://naifgravity.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "naif-gravity-mcp-diagnostics": {
      "type": "streamableHttp",
      "url": "https://naifgravity.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start naif-gravity-mcp-diagnostics and inspect its tools.
VS Code configuration
{
  "servers": {
    "naif-gravity-mcp-diagnostics": {
      "type": "http",
      "url": "https://naifgravity.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http naif-gravity-mcp-diagnostics https://naifgravity.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://naifgravity.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "naif-gravity-mcp-diagnostics": {
      "serverUrl": "https://naifgravity.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like NAIF Gravity MCP Diagnostics from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.