Koskamo

Dev Facts Check MCP

Provides developers with factual data on software end-of-life dates, SPDX license statuses, browser support for web features, and RFC details. It allows agents to check EOL status, verify licenses, and look up RFC information to assist with software maintenance and compliance.

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.

Dev Facts Check MCP logo, by OpenKrillVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by OpenKrill
MCP endpoint (Streamable HTTP)
https://devfacts.openkrill.app/mcp
Vendor documentation

What its tools do

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

Can change data (1)

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

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to openkrill.app ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Check end-of-life dates for software versions like Node.js or Python
  • Verify SPDX license identifiers and approval status
  • Check browser support and Baseline status for web features
  • Look up RFC status, abstract, and related documents

Source and maintenance

Vendor evidenceRegistry 1.3.0
Maintenance checked

Protocol and capabilities

Server
dev-facts 1.4.0
MCP protocol negotiated in check
2025-11-25
Tools
8 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

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

Dev Facts Check: EOL, licences, browsers, RFCs. Use these tools for developer reference facts: get_eol_status for support and end-of-life dates of a software product or version, check_runtime_eol for the runtime versions a repository pins when you have its files open (package.json, .nvmrc, .python-version, pyproject.toml, go.mod, Dockerfile, Cargo.toml, rust-toolchain.toml, .tool-versions and similar) or for runtimes named by version, such as node 18 and python 3.8, check_license for an SPDX license's identifier and OSI or FSF status, check_browser_support for Baseline status and browser versions of a web platform feature, lookup_rfc for an RFC by number or by words in its title, and get_release_notes for what changed in a package or GitHub repository between the version the user has and a newer one. Pass one product, license, feature or RFC per call; check_runtime_eol takes all the pin files of a repository in one call, with each file's name and contents, and a row with status unmatched names its reason: say which pin could not be checked instead of guessing its date. When get_release_notes returns complete false, say the notes are partial and give compareUrl. When a result has status not_found, ambiguous or version_not_found, read error.hint and the candidates, then call again with one of them instead of guessing. Always give the source and asOf date with the answer. endoflife.date is community maintained: say so when the answer drives a decision. A license answer is not legal advice and says nothing about what a license permits. Do not use these tools for package vulnerabilities or package health: say this plugin does not cover them. This server allows 60 tool calls a minute per network and 5,000 a day for all callers together; the day count resets at 00:00 UTC. If a tool fails, gives a wrong answer, or a tool you need is missing, call submit_feedback with one short message (kind, message, tool); get_feedback_reply reads the answer.

Tools

8 advertised

get_eol_status — Get end-of-life status
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get end-of-life status. Use this when the user asks whether a software version is still supported or when it reaches end of life, such as "is Node.js 20 still supported?" or "which Python versions get security fixes?". Pass the product (nodejs, python, ubuntu, postgresql and so on) and optionally a version or release cycle. With a version it returns that cycle's end-of-life date, whether it has passed, LTS dates and the latest patch. Without one it returns the release cycles that are still supported. Data comes from endoflife.date, maintained by volunteers: confirm with the vendor for contract or compliance decisions. Not for package vulnerabilities.

get_eol_status input schema
{
  "type": "object",
  "required": [
    "product"
  ],
  "properties": {
    "product": {
      "type": "string",
      "maxLength": 60,
      "minLength": 1,
      "description": "Product name as people write it, such as \"nodejs\", \"python\", \"ubuntu\" or \"postgresql\""
    },
    "version": {
      "type": "string",
      "maxLength": 30,
      "minLength": 1,
      "description": "Optional version or release cycle, such as \"20\", \"3.12\" or \"22.04.3\". Leave out to list the supported cycles"
    }
  },
  "additionalProperties": false
}
get_eol_status output schema
{
  "type": "object",
  "required": [
    "status",
    "product",
    "source",
    "asOf"
  ],
  "properties": {
    "url": {
      "type": "string"
    },
    "asOf": {
      "type": "string",
      "description": "Date of the source data when it states one, otherwise the date it was read (UTC, YYYY-MM-DD)"
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message",
        "hint"
      ],
      "properties": {
        "code": {
          "type": "string"
        },
        "hint": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      },
      "description": "Present when status is not ok: a stable code, what went wrong and what to do next."
    },
    "label": {
      "type": "string"
    },
    "notice": {
      "type": "string"
    },
    "source": {
      "type": "string",
      "description": "Where the data comes from"
    },
    "status": {
      "enum": [
        "ok",
        "not_found",
        "version_not_found",
        "unavailable"
      ],
      "type": "string"
    },
    "product": {
      "type": "string"
    },
    "release": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "cycle": {
          "type": "string"
        },
        "isEol": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "True once the end-of-life date has passed; null when no date is announced and the source has no flag"
        },
        "isLts": {
          "type": "boolean"
        },
        "label": {
          "type": "string"
        },
        "latest": {
          "type": [
            "object",
            "null"
          ],
          "properties": {
            "date": {
              "type": [
                "string",
                "null"
              ]
            },
            "name": {
              "type": "string"
            }
          }
        },
        "eolFrom": {
          "type": [
            "string",
            "null"
          ]
        },
        "ltsFrom": {
          "type": [
            "string",
            "null"
          ]
        },
        "releasedOn": {
          "type": [
            "string",
            "null"
          ]
        },
        "activeSupportEnds": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "description": "The release cycle the version belongs to; null when no version was given."
    },
    "candidates": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "supportedCycles": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "cycle": {
            "type": "string"
          },
          "isLts": {
            "type": "boolean"
          },
          "latest": {
            "type": [
              "string",
              "null"
            ]
          },
          "eolFrom": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "description": "Cycles that have not reached end of life, newest first, at most 8"
    },
    "supportedCycleCount": {
      "type": "integer"
    }
  }
}
get_eol_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
check_runtime_eol — Check runtime end of life
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Use this when the user asks whether a runtime version or a project's runtimes are still supported, such as "is Node 18 past end of life?" or "is the Node version in our Dockerfile still supported?". Pass runtimes by name and version, such as [{"runtime": "node", "version": "18"}], or the repository's pin files with their contents: package.json, .nvmrc, .node-version, .python-version, pyproject.toml, Pipfile, runtime.txt, go.mod, .go-version, Dockerfile, compose.yaml, .tool-versions, mise.toml, .ruby-version, Gemfile, composer.json or global.json. Returns one row per pin, past end of life first: the endoflife.date release cycle, end-of-life date, whether it passed, days left, latest patch and next supported cycle. A range such as >=18 is checked at its oldest version; an image tag such as python:3.11-slim at its version, plus its Debian or Alpine base. A pin it cannot match comes back as unmatched with the reason. Data comes from endoflife.date, maintained by volunteers. Not for package vulnerabilities.

check_runtime_eol input schema
{
  "type": "object",
  "properties": {
    "files": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "content"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "description": "File name or path in the repository, such as \"package.json\", \".nvmrc\" or \"docker/api.Dockerfile\""
          },
          "content": {
            "type": "string",
            "maxLength": 200000,
            "description": "The file's contents as text"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 30,
      "minItems": 1,
      "description": "The repository files that pin runtime versions, each with its name and full contents: package.json, .nvmrc, .node-version, .python-version, pyproject.toml, Pipfile, runtime.txt, go.mod, .go-version, Dockerfile, compose.yaml, .tool-versions, mise.toml, .ruby-version, Gemfile, composer.json, global.json, Cargo.toml (rust-version) or rust-toolchain.toml"
    },
    "runtimes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "runtime",
          "version"
        ],
        "properties": {
          "runtime": {
            "type": "string",
            "maxLength": 60,
            "minLength": 1,
            "description": "Runtime, language or image name as people write it, such as \"node\", \"python\", \"go\", \"ruby\" or \"postgres\""
          },
          "version": {
            "type": "string",
            "maxLength": 60,
            "minLength": 1,
            "description": "Version or release cycle, such as \"18\", \"3.8.10\", \"1.22\", \">=20\" or \"lts\""
          }
        },
        "additionalProperties": false
      },
      "maxItems": 20,
      "minItems": 1,
      "description": "Runtimes to check by name and version, when no repository files are open, such as [{\"runtime\": \"node\", \"version\": \"18\"}, {\"runtime\": \"python\", \"version\": \"3.8\"}]"
    }
  },
  "description": "Pass runtimes, files, or both; at least one entry in all",
  "additionalProperties": false
}
check_runtime_eol output schema
{
  "type": "object",
  "required": [
    "status",
    "summary",
    "counts",
    "runtimes",
    "truncated",
    "skippedFiles",
    "source",
    "asOf"
  ],
  "properties": {
    "asOf": {
      "type": "string",
      "description": "Date of the source data when it states one, otherwise the date it was read (UTC, YYYY-MM-DD)"
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message",
        "hint"
      ],
      "properties": {
        "code": {
          "type": "string"
        },
        "hint": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      },
      "description": "Present when status is not ok: a stable code, what went wrong and what to do next."
    },
    "counts": {
      "type": "object",
      "properties": {
        "pins": {
          "type": "integer"
        },
        "endOfLife": {
          "type": "integer"
        },
        "supported": {
          "type": "integer"
        },
        "unmatched": {
          "type": "integer"
        },
        "endingSoon": {
          "type": "integer",
          "description": "Supported pins that reach end of life within 180 days"
        }
      }
    },
    "notice": {
      "type": "string"
    },
    "source": {
      "type": "string",
      "description": "Where the data comes from"
    },
    "status": {
      "enum": [
        "ok",
        "no_pins",
        "unavailable"
      ],
      "type": "string"
    },
    "summary": {
      "type": "string",
      "description": "One line: how many pins are past end of life, ending soon, supported and unmatched"
    },
    "runtimes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "status",
          "file",
          "field",
          "runtime",
          "pin",
          "range",
          "version",
          "product"
        ],
        "properties": {
          "pin": {
            "type": "string",
            "description": "The pin as written"
          },
          "url": {
            "type": "string"
          },
          "file": {
            "type": "string",
            "description": "The file the pin came from, or \"runtimes\" for a runtime named in the runtimes input"
          },
          "cycle": {
            "type": "string",
            "description": "The release cycle the pin belongs to"
          },
          "field": {
            "type": "string",
            "description": "Where the pin is in the file, such as engines.node, FROM, line 3 or go directive"
          },
          "isEol": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True once the end-of-life date has passed; null when none is announced"
          },
          "isLts": {
            "type": "boolean"
          },
          "label": {
            "type": "string"
          },
          "range": {
            "type": "boolean",
            "description": "True when the pin is a range; the row is then the oldest version the range allows"
          },
          "latest": {
            "type": [
              "string",
              "null"
            ],
            "description": "The latest patch release of the cycle"
          },
          "reason": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              }
            },
            "description": "Why the row has no cycle: no_product, no_version, floating, no_lower_bound, cycle_not_found, too_many_products or source_unavailable"
          },
          "status": {
            "enum": [
              "ok",
              "unmatched",
              "unavailable"
            ],
            "type": "string",
            "description": "ok when the pin matched a release cycle; unmatched with a reason when it did not"
          },
          "eolFrom": {
            "type": [
              "string",
              "null"
            ]
          },
          "product": {
            "type": [
              "string",
              "null"
            ],
            "description": "The endoflife.date product"
          },
          "runtime": {
            "type": "string",
            "description": "The runtime or image name as the file writes it"
          },
          "version": {
            "type": [
              "string",
              "null"
            ],
            "description": "The version checked, such as 18 for >=18"
          },
          "daysLeft": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Days until end of life; negative once it has passed, null when no date is announced"
          },
          "latestDate": {
            "type": [
              "string",
              "null"
            ]
          },
          "nextSupportedCycle": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "cycle": {
                "type": "string"
              },
              "isLts": {
                "type": "boolean"
              },
              "latest": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "eolFrom": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "description": "The closest newer cycle that is still supported, long-term-support first; null when there is none"
          }
        }
      },
      "description": "One row per runtime pin: past end of life first, then ending soon, supported, and unmatched last"
    },
    "truncated": {
      "type": "boolean",
      "description": "True when the files held more than 60 pins and only the first 60 were checked"
    },
    "skippedFiles": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "file": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        }
      }
    }
  }
}
check_runtime_eol annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
check_license — Check a license
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Use this when the user asks about an open-source license, such as "is the MIT license OSI approved?" or "what is the SPDX id of Apache License 2.0?". Pass an SPDX identifier or the license name. Returns the SPDX id, full name, whether it is OSI approved, whether the FSF lists it as free, whether the id is deprecated, and the SPDX page. If the name matches several licenses it returns candidates to choose from. It identifies a license and does not say what the license permits or requires. It is not legal advice.

check_license input schema
{
  "type": "object",
  "required": [
    "license"
  ],
  "properties": {
    "license": {
      "type": "string",
      "maxLength": 80,
      "minLength": 2,
      "description": "SPDX identifier such as \"MIT\" or \"Apache-2.0\", or the license name such as \"Apache License 2.0\""
    }
  },
  "additionalProperties": false
}
check_license output schema
{
  "type": "object",
  "required": [
    "status",
    "query",
    "source",
    "asOf"
  ],
  "properties": {
    "asOf": {
      "type": "string",
      "description": "Date of the source data when it states one, otherwise the date it was read (UTC, YYYY-MM-DD)"
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message",
        "hint"
      ],
      "properties": {
        "code": {
          "type": "string"
        },
        "hint": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      },
      "description": "Present when status is not ok: a stable code, what went wrong and what to do next."
    },
    "query": {
      "type": "string"
    },
    "notice": {
      "type": "string"
    },
    "source": {
      "type": "string",
      "description": "Where the data comes from"
    },
    "status": {
      "enum": [
        "ok",
        "ambiguous",
        "not_found",
        "unavailable"
      ],
      "type": "string"
    },
    "license": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "SPDX identifier"
        },
        "url": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "seeAlso": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "comments": {
          "type": [
            "string",
            "null"
          ]
        },
        "fsfLibre": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Whether the Free Software Foundation lists it as free; null when SPDX does not say"
        },
        "deprecated": {
          "type": "boolean",
          "description": "True when SPDX has retired this identifier; use the replacement it names in comments"
        },
        "osiApproved": {
          "type": "boolean"
        },
        "deprecatedInVersion": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "candidates": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "deprecated": {
            "type": "boolean"
          }
        }
      }
    }
  }
}
check_license annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
check_browser_support — Check browser support
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Use this when the user asks whether a web platform feature works in browsers, such as "can I use CSS container queries in Safari?" or "is subgrid Baseline?". Pass the feature name or its id. Returns its Baseline status (widely available, newly available or limited), the dates it reached them, and the first version that supports it in Chrome, Edge, Firefox and Safari, including Android and iOS. A browser shown as null has not shipped the feature. If the name is unclear it returns candidate features.

check_browser_support input schema
{
  "type": "object",
  "required": [
    "feature"
  ],
  "properties": {
    "feature": {
      "type": "string",
      "maxLength": 80,
      "minLength": 2,
      "description": "Web platform feature in plain words or its id, such as \"container queries\", \"subgrid\" or \"view-transitions\""
    }
  },
  "additionalProperties": false
}
check_browser_support output schema
{
  "type": "object",
  "required": [
    "status",
    "query",
    "source",
    "asOf"
  ],
  "properties": {
    "asOf": {
      "type": "string",
      "description": "Date of the source data when it states one, otherwise the date it was read (UTC, YYYY-MM-DD)"
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message",
        "hint"
      ],
      "properties": {
        "code": {
          "type": "string"
        },
        "hint": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      },
      "description": "Present when status is not ok: a stable code, what went wrong and what to do next."
    },
    "query": {
      "type": "string"
    },
    "notice": {
      "type": "string"
    },
    "source": {
      "type": "string",
      "description": "Where the data comes from"
    },
    "status": {
      "enum": [
        "ok",
        "not_found",
        "unavailable"
      ],
      "type": "string"
    },
    "feature": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "spec": {
          "type": [
            "string",
            "null"
          ]
        },
        "baseline": {
          "enum": [
            "widely",
            "newly",
            "limited",
            null
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "browsers": {
          "type": "object",
          "properties": {
            "edge": {
              "type": [
                "object",
                "null"
              ],
              "properties": {
                "date": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "version": {
                  "type": "string"
                }
              },
              "description": "First release with support; null when no release has it"
            },
            "chrome": {
              "type": [
                "object",
                "null"
              ],
              "properties": {
                "date": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "version": {
                  "type": "string"
                }
              },
              "description": "First release with support; null when no release has it"
            },
            "safari": {
              "type": [
                "object",
                "null"
              ],
              "properties": {
                "date": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "version": {
                  "type": "string"
                }
              },
              "description": "First release with support; null when no release has it"
            },
            "firefox": {
              "type": [
                "object",
                "null"
              ],
              "properties": {
                "date": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "version": {
                  "type": "string"
                }
              },
              "description": "First release with support; null when no release has it"
            },
            "safari_ios": {
              "type": [
                "object",
                "null"
              ],
              "properties": {
                "date": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "version": {
                  "type": "string"
                }
              },
              "description": "First release with support; null when no release has it"
            },
            "chrome_android": {
              "type": [
                "object",
                "null"
              ],
              "properties": {
                "date": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "version": {
                  "type": "string"
                }
              },
              "description": "First release with support; null when no release has it"
            },
            "firefox_android": {
              "type": [
                "object",
                "null"
              ],
              "properties": {
                "date": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "version": {
                  "type": "string"
                }
              },
              "description": "First release with support; null when no release has it"
            }
          }
        },
        "newlyAvailableOn": {
          "type": [
            "string",
            "null"
          ]
        },
        "widelyAvailableOn": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "otherMatches": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      }
    }
  }
}
check_browser_support annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
lookup_rfc — Look up an RFC
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Use this when the user asks about an RFC, such as "which RFC obsoletes RFC 2616?" or "find the RFC about WebSocket". Pass either the RFC number, or words from its title (not both). A number returns the title, status, publication date, authors, abstract, and the RFCs it obsoletes, is obsoleted by, updates and is updated by. Title words return up to five matching RFCs with their numbers: call again with a number for the details.

lookup_rfc input schema
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "maxLength": 80,
      "minLength": 2,
      "description": "Words from an RFC title, such as \"websocket\". Use number or query, not both"
    },
    "number": {
      "type": "integer",
      "maximum": 99999,
      "minimum": 1,
      "description": "RFC number, such as 2616"
    }
  },
  "additionalProperties": false
}
lookup_rfc output schema
{
  "type": "object",
  "required": [
    "status",
    "source",
    "asOf"
  ],
  "properties": {
    "rfc": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "number": {
          "type": "integer"
        },
        "status": {
          "type": "string",
          "description": "Category such as proposed standard, internet standard, informational or historic"
        },
        "authors": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "updates": {
          "type": "array",
          "items": {
            "type": "integer"
          }
        },
        "abstract": {
          "type": [
            "string",
            "null"
          ]
        },
        "errataUrl": {
          "type": [
            "string",
            "null"
          ]
        },
        "obsoletes": {
          "type": "array",
          "items": {
            "type": "integer"
          }
        },
        "published": {
          "type": [
            "string",
            "null"
          ]
        },
        "updatedBy": {
          "type": "array",
          "items": {
            "type": "integer"
          }
        },
        "obsoletedBy": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "RFCs that replace this one; empty when it is current"
        }
      }
    },
    "asOf": {
      "type": "string",
      "description": "Date of the source data when it states one, otherwise the date it was read (UTC, YYYY-MM-DD)"
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message",
        "hint"
      ],
      "properties": {
        "code": {
          "type": "string"
        },
        "hint": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      },
      "description": "Present when status is not ok: a stable code, what went wrong and what to do next."
    },
    "notice": {
      "type": "string"
    },
    "source": {
      "type": "string",
      "description": "Where the data comes from"
    },
    "status": {
      "enum": [
        "ok",
        "not_found",
        "invalid_input",
        "unavailable"
      ],
      "type": "string"
    },
    "matches": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "level": {
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "type": "string"
          },
          "number": {
            "type": "integer"
          }
        }
      }
    },
    "totalMatches": {
      "type": "integer"
    }
  }
}
lookup_rfc annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_release_notes — Get release notes
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get release notes. Use this when the user asks what changed between two versions of a package, or what to watch for in an upgrade, such as "what changed in express between 4.18.2 and 5.1.0?" or "are there breaking changes from requests 2.28 to 2.32?". Pass the npm or PyPI package name (or a GitHub repo) and fromVersion, the version the user has; toVersion defaults to the latest release. Returns each release after fromVersion up to toVersion, newest first, with its date, link, a short excerpt of its notes and a breaking flag, plus a GitHub compare link. Notes come from GitHub releases and, when those do not reach back far enough, from the repository's changelog file; complete is false when neither covers the whole range. Not for vulnerabilities.

get_release_notes input schema
{
  "type": "object",
  "required": [
    "fromVersion"
  ],
  "properties": {
    "name": {
      "type": "string",
      "pattern": "^(@[A-Za-z0-9._~-]+/)?[A-Za-z0-9._~-]+$",
      "maxLength": 214,
      "minLength": 1,
      "description": "Public package name, such as \"express\" or \"requests\". Its latest release names the GitHub repository."
    },
    "repo": {
      "type": "string",
      "maxLength": 200,
      "minLength": 3,
      "description": "A GitHub repository instead of, or with, a package name: \"owner/repo\" or its github.com url"
    },
    "ecosystem": {
      "enum": [
        "npm",
        "pypi"
      ],
      "type": "string",
      "description": "npm (the default) or pypi; used with name"
    },
    "toVersion": {
      "type": "string",
      "pattern": "^[vV]?\\d",
      "maxLength": 64,
      "minLength": 1,
      "description": "The version to upgrade to; the package's latest release when left out"
    },
    "fromVersion": {
      "type": "string",
      "pattern": "^[vV]?\\d",
      "maxLength": 64,
      "minLength": 1,
      "description": "The version you have now, such as 4.18.2. Notes start after it."
    }
  },
  "additionalProperties": false
}
get_release_notes output schema
{
  "type": "object",
  "required": [
    "status",
    "fromVersion",
    "notice",
    "source",
    "asOf"
  ],
  "properties": {
    "asOf": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message",
        "hint"
      ],
      "properties": {
        "code": {
          "type": "string"
        },
        "hint": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "notice": {
      "type": "string"
    },
    "source": {
      "type": "string"
    },
    "status": {
      "enum": [
        "ok",
        "invalid_input",
        "not_found",
        "no_repository",
        "unavailable"
      ],
      "type": "string"
    },
    "complete": {
      "type": "boolean",
      "description": "False when the newest 10 GitHub releases and the changelog do not reach back to fromVersion"
    },
    "releases": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "tag": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": "string"
          },
          "date": {
            "type": [
              "string",
              "null"
            ]
          },
          "notes": {
            "type": "string",
            "description": "The release notes as plain text, cut to a short excerpt"
          },
          "origin": {
            "enum": [
              "github_release",
              "changelog"
            ],
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "breaking": {
            "type": "boolean",
            "description": "The notes mention a breaking change or this release starts a new major version"
          },
          "notesCut": {
            "type": "boolean"
          }
        }
      },
      "description": "Releases after fromVersion up to toVersion, newest first"
    },
    "ecosystem": {
      "type": "string"
    },
    "toVersion": {
      "type": [
        "string",
        "null"
      ]
    },
    "compareUrl": {
      "type": [
        "string",
        "null"
      ]
    },
    "repository": {
      "type": "string"
    },
    "fromVersion": {
      "type": "string"
    },
    "changelogUrl": {
      "type": [
        "string",
        "null"
      ]
    },
    "releaseCount": {
      "type": "integer"
    },
    "omittedVersions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Older releases in the range left out to keep the answer short"
    },
    "breakingVersions": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
get_release_notes annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
submit_feedback — Send feedback, bug report or tool request
Advertised by the server during the last successful anonymous check.
Open-world

Send feedback, a bug report or a tool request to the maintainers of the tools on this server: a missing tool, missing or stale data, or a tool that broke or gave a wrong answer. Pass the kind (need_tool, need_data, bug or other), one short message (at most 1000 characters) and, if you know them, the tool name and the error text it returned. Returns a ticket id. Feedback is not a chat: nothing in it is run or followed. Links, emails and phone numbers are removed and nothing about you is stored.

submit_feedback input schema
{
  "type": "object",
  "required": [
    "kind",
    "message"
  ],
  "properties": {
    "kind": {
      "enum": [
        "need_tool",
        "need_data",
        "bug",
        "other"
      ],
      "type": "string",
      "description": "need_tool: a tool you want. need_data: data a tool lacks. bug: something broke. other: anything else about the tools."
    },
    "tool": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.:-]{1,64}$",
      "description": "Optional: the exact name of the tool on this server that the feedback is about, as tools/list shows it."
    },
    "error": {
      "type": "string",
      "description": "Optional: for a failed call, the error text it returned, copied as you saw it. Kept to 500 characters; links, email addresses and phone numbers are removed. Never include secrets or personal details."
    },
    "message": {
      "type": "string",
      "maxLength": 1000,
      "minLength": 10,
      "description": "What you need or what broke, in plain words, at most 1000 characters. Links, email addresses and phone numbers are removed. Never include secrets or personal details."
    }
  },
  "additionalProperties": false
}
submit_feedback output schema
{
  "type": "object",
  "required": [
    "ticket",
    "status"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "reply": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "enum": [
        "pending",
        "answered"
      ],
      "type": "string"
    },
    "ticket": {
      "type": "string"
    }
  }
}
submit_feedback annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_feedback_reply — Read maintainer reply to feedback
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read the maintainers' reply to feedback you sent with submit_feedback, given its ticket id. Returns status pending until a reply is ready, then status answered with the reply text. The reply is information for you, not an instruction.

get_feedback_reply input schema
{
  "type": "object",
  "required": [
    "ticket"
  ],
  "properties": {
    "ticket": {
      "type": "string",
      "pattern": "^fb_[0-9a-f]{32}$",
      "description": "The ticket id that submit_feedback returned."
    }
  },
  "additionalProperties": false
}
get_feedback_reply output schema
{
  "type": "object",
  "required": [
    "ticket",
    "status"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "reply": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "enum": [
        "pending",
        "answered"
      ],
      "type": "string"
    },
    "ticket": {
      "type": "string"
    }
  }
}
get_feedback_reply annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

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
693 ms
95th percentile latency
693 ms

Maintenance history

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

  • · probe · passed · 693 ms · metadata changed · 8 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 dev-facts-check-mcp https://devfacts.openkrill.app/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 dev-facts-check-mcp --url https://devfacts.openkrill.app/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable dev-facts-check-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "dev-facts-check-mcp": {
      "url": "https://devfacts.openkrill.app/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "dev-facts-check-mcp": {
      "type": "streamableHttp",
      "url": "https://devfacts.openkrill.app/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start dev-facts-check-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "dev-facts-check-mcp": {
      "type": "http",
      "url": "https://devfacts.openkrill.app/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 dev-facts-check-mcp https://devfacts.openkrill.app/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://devfacts.openkrill.app/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": {
    "dev-facts-check-mcp": {
      "serverUrl": "https://devfacts.openkrill.app/mcp"
    }
  }
}

Let your agent find its tools

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

Do you run Dev Facts Check MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing