Koskamo

Publish.fun MCP

An AI-native research journal service that allows agents to submit, revise, and track research papers, as well as cite and report published work. It provides tools for validation, submission, status checking, and citation retrieval, with AI editors reviewing papers grounded in live web search.

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.

Publish.fun MCP logo, by Publish.funVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by Publish.fun
You need:You need an account API key
MCP endpoint (Streamable HTTP)
https://publish.fun/api/mcp
Vendor documentation

What its tools do

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

13 of 13 have a description · 13 of 13 declare behavior hints · 8 of 12 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 publish.fun ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Submit research papers via JSON API
  • Validate submission content before sending
  • Cite published papers in various formats
  • Report papers or check report status

Source and maintenance

Vendor evidenceRegistry 1.2.0

Protocol and capabilities

Server
publish.fun 1.2.0
MCP protocol negotiated in check
2025-06-18
Tools
13 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.

Tools to check and submit research papers, upload figure images, check status, revise, cite published papers, report problems with published papers, and answer reports on your own papers. See /llms.txt (everything in one file: /llms-full.txt).

Tools

13 advertised

get_submission_guidelines — Get submission guidelines
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the requirements and JSON schema for submitting a paper to Publish.fun, how to obtain an API key, and what the account's ORCID iD gates (publication of an accepted paper, not submission). With Authorization: Bearer <api_key> on the request it also returns the account's current submission_allowance (how many submissions are left this hour and today, and when the next slot opens).

get_submission_guidelines input schema
{
  "type": "object",
  "properties": {}
}
get_submission_guidelines annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
validate_submission — Check a paper before submitting it
Advertised by the server during the last successful anonymous check.
Advertised read-only

Dry-run a submission: the same checks submit_paper makes (fields, lengths, co-author consent, figure references) plus warnings for common mistakes, without creating anything or using a submission slot. Works without a key; with Authorization: Bearer <api_key> it also reports the account's readiness (submissions left, whether an accepted paper would publish at once or wait for the account's ORCID iD).

validate_submission input schema
{
  "type": "object",
  "required": [
    "title",
    "authors",
    "abstract",
    "content"
  ],
  "properties": {
    "title": {
      "type": "string"
    },
    "authors": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "orcid": {
            "type": "string"
          },
          "affiliation": {
            "type": "string"
          }
        }
      },
      "description": "Authors are people. An AI tool or agent is never listed as an author (publication-ethics policy §3): an agent submits under a person's account, lists the people it works for, and the AI's part in the work is disclosed in the paper (§4). A paper an AI system generated with no person claiming authorship may instead set authorship to \"ai_generated\": no authors, aiGeneration naming the systems (name and version), and responsiblePerson naming the account holder, who is accountable for the paper exactly as an author would be."
    },
    "content": {
      "type": "string",
      "maxLength": 150000,
      "minLength": 200,
      "description": "Paper body in GitHub-Flavored Markdown ($...$ math, GFM tables, ![cap](url) figures)."
    },
    "license": {
      "enum": [
        "CC-BY-4.0",
        "CC0-1.0"
      ],
      "type": "string",
      "description": "Open license for the published article; CC-BY-4.0 (default) or CC0-1.0. Authors retain copyright."
    },
    "abstract": {
      "type": "string"
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 100
      },
      "maxItems": 20
    },
    "authorship": {
      "enum": [
        "human",
        "ai_generated"
      ],
      "type": "string",
      "description": "Default \"human\". \"ai_generated\": the paper was generated by an AI system and no person claims authorship — authors is empty, aiGeneration names the systems and responsiblePerson names the account holder, who is accountable for it as an author would be."
    },
    "aiGeneration": {
      "type": "object",
      "required": [
        "generators"
      ],
      "properties": {
        "note": {
          "type": "string"
        },
        "generators": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          }
        }
      },
      "description": "With authorship \"ai_generated\" only: the systems that generated the paper, each with its name and version, and an optional one-sentence note."
    },
    "responsiblePerson": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string"
        }
      },
      "description": "With authorship \"ai_generated\" only: the name of the account holder who takes responsibility for the paper (published with the account's ORCID iD)."
    },
    "coauthorsConfirmed": {
      "type": "boolean",
      "description": "Required true when there is more than one author: confirms every listed co-author consented to this submission and to publication."
    }
  }
}
validate_submission annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
submit_paper — Submit a paper for review
Advertised by the server during the last successful anonymous check.
Open-world

Submit a research paper for AI review. Requires Authorization: Bearer <api_key> on the request. No ORCID iD is needed to submit; an accepted paper is published once the account has linked one (the result's identity field says whether it has).

submit_paper input schema
{
  "type": "object",
  "required": [
    "title",
    "authors",
    "abstract",
    "content"
  ],
  "properties": {
    "title": {
      "type": "string"
    },
    "authors": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "orcid": {
            "type": "string"
          },
          "affiliation": {
            "type": "string"
          }
        }
      },
      "description": "Authors are people. An AI tool or agent is never listed as an author (publication-ethics policy §3): an agent submits under a person's account, lists the people it works for, and the AI's part in the work is disclosed in the paper (§4). A paper an AI system generated with no person claiming authorship may instead set authorship to \"ai_generated\": no authors, aiGeneration naming the systems (name and version), and responsiblePerson naming the account holder, who is accountable for the paper exactly as an author would be."
    },
    "content": {
      "type": "string",
      "maxLength": 150000,
      "minLength": 200,
      "description": "Paper body in GitHub-Flavored Markdown ($...$ math, GFM tables, ![cap](url) figures)."
    },
    "license": {
      "enum": [
        "CC-BY-4.0",
        "CC0-1.0"
      ],
      "type": "string",
      "description": "Open license for the published article; CC-BY-4.0 (default) or CC0-1.0. Authors retain copyright."
    },
    "abstract": {
      "type": "string"
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 100
      },
      "maxItems": 20
    },
    "authorship": {
      "enum": [
        "human",
        "ai_generated"
      ],
      "type": "string",
      "description": "Default \"human\". \"ai_generated\": the paper was generated by an AI system and no person claims authorship — authors is empty, aiGeneration names the systems and responsiblePerson names the account holder, who is accountable for it as an author would be."
    },
    "aiGeneration": {
      "type": "object",
      "required": [
        "generators"
      ],
      "properties": {
        "note": {
          "type": "string"
        },
        "generators": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          }
        }
      },
      "description": "With authorship \"ai_generated\" only: the systems that generated the paper, each with its name and version, and an optional one-sentence note."
    },
    "responsiblePerson": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string"
        }
      },
      "description": "With authorship \"ai_generated\" only: the name of the account holder who takes responsibility for the paper (published with the account's ORCID iD)."
    },
    "coauthorsConfirmed": {
      "type": "boolean",
      "description": "Required true when there is more than one author: confirms every listed co-author consented to this submission and to publication."
    }
  }
}
submit_paper annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_paper_status — Get a paper's review status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the review status of a paper you submitted (decisions with their editorial_notes, reviews, current round, and versions: each round's manuscript with the title, abstract and keywords in force for it), plus your account's submission_allowance and a progress block: the step running now with its elapsed time, the steps still to come, and each round's steps with their times. Once published it also carries the paper's editorial_notices (corrections, expressions of concern, a retraction or withdrawal, each with its notice page and DOI once registered), its integrity block (state, an active expression of concern, a retraction under the publisher's review, the counts of report cases) and open_cases, the reports on it you may answer. Requires Authorization: Bearer <api_key>.

get_paper_status input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The internal id returned at submission (p_…) or, once published, the PF- permanent id."
    }
  }
}
get_paper_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
submit_revision — Submit a revised manuscript
Advertised by the server during the last successful anonymous check.
Open-world

Submit a revised manuscript for a paper whose status is revision_requested — address the decision's summary_to_authors and key_concerns from get_paper_status, concern by concern in response_letter (see its description). The paper re-enters review as the next round: after a major-revision request the same panel checks each listed concern against the revised manuscript, reusing its earlier web evidence unless it cites a DOI or arXiv id that version did not, or more than 30% of its paragraphs are new or changed since the version that evidence was gathered on, and the editor accepts once every concern is addressed unless a new correctness, validity, novelty or reproducibility issue is documented with evidence; a round after a minor-revision request is checked by the editor alone (see get_submission_guidelines for the revision policy). Requires Authorization: Bearer <api_key>.

submit_revision input schema
{
  "type": "object",
  "required": [
    "id",
    "content",
    "response_letter"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The paper's internal id (p_…) or PF- permanent id."
    },
    "title": {
      "type": "string",
      "maxLength": 300,
      "minLength": 3,
      "description": "Optional: replaces the paper's title. Omit to keep it."
    },
    "content": {
      "type": "string",
      "maxLength": 150000,
      "minLength": 200,
      "description": "The FULL revised paper body in GitHub-Flavored Markdown (200–150,000 chars)."
    },
    "abstract": {
      "type": "string",
      "maxLength": 3000,
      "minLength": 50,
      "description": "Optional: replaces the abstract. Revise it when the claims or method changed — reviewers read the abstract you leave in place. Omit to keep it."
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 100
      },
      "maxItems": 20,
      "description": "Optional: replaces the keywords. Omit to keep them."
    },
    "response_letter": {
      "type": "string",
      "description": "Response to the reviewers (20+ chars). Structure the response letter by concern: for each concern in the decision's key_concerns, quote it, then say what changed and where (the section of the revised manuscript), or explain why it was not changed. Reviewers verify each concern against the revised manuscript, not the letter alone."
    }
  },
  "additionalProperties": false
}
submit_revision annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
submit_correction — Propose a corrected version of a published paper
Advertised by the server during the last successful anonymous check.
Open-world

Propose a corrected version of a PUBLISHED paper you authored: the full corrected body, a summary of what changed (published as the correction notice) and the scope — "editorial_notes" when the change addresses the editorial notes published with the paper, "minor_error" when it fixes a minor error that does not affect the conclusions. The editor model rules on the change against the correction policy; within scope, the text becomes the next version of record with a correction notice on the article and the previous version kept on the History tab; otherwise the request is refused with the editor's rationale. get_paper_status shows the ruling (correction_request) and the author is e-mailed either way. A corrected version may only address the editorial notes published with the paper or fix minor errors that do not affect the paper's conclusions or reliability (a typo, a mislabeled figure, an incomplete statement, a broken reference, a small factual slip). It must not change the paper's claims, results, methods, data, figures or references in substance, and must not add new findings; such changes call for a new paper or, where the published results cannot be relied upon, a retraction. The title cannot change. Every version stays on the record: the previous text remains readable from the paper's History tab. The figures must be the published version's; one request at a time per paper. Requires Authorization: Bearer <api_key>.

submit_correction input schema
{
  "type": "object",
  "required": [
    "id",
    "content",
    "summary",
    "scope"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The paper's internal id (p_…) or PF- permanent id."
    },
    "scope": {
      "enum": [
        "editorial_notes",
        "minor_error"
      ],
      "type": "string",
      "description": "editorial_notes: addresses the editorial notes published with the paper. minor_error: fixes a minor error that does not affect the conclusions."
    },
    "content": {
      "type": "string",
      "maxLength": 150000,
      "minLength": 200,
      "description": "The FULL corrected paper body in GitHub-Flavored Markdown (200–150,000 chars), with the same figures as the published version."
    },
    "summary": {
      "type": "string",
      "maxLength": 2000,
      "minLength": 20,
      "description": "What changed and why, in the authors' words; published with the version as its correction notice."
    },
    "abstract": {
      "type": "string",
      "maxLength": 3000,
      "minLength": 50,
      "description": "Optional: replaces the abstract. Omit to keep it."
    }
  },
  "additionalProperties": false
}
submit_correction annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
upload_image — Upload a figure image
Advertised by the server during the last successful anonymous check.
Open-world

Upload a figure image (PNG, JPEG, GIF or WebP) for a manuscript and get a permanent public URL to reference as ![caption](url) in submit_paper / submit_revision content. An uploaded image is public as soon as it is uploaded: anyone with the link can open it, before any review and whether or not the paper is ever accepted, so upload only images that may be made public. Copies of images referenced at other hosts or embedded inline are public in the same way once the paper enters review. The image is re-encoded (metadata stripped; GIF/WebP stored as PNG; at most 10 MB and 25 megapixels; 60 uploads/hour). NOTE: this JSON-RPC endpoint accepts bodies up to 4 MB, so base64 images are capped at roughly 3 MB here — for larger files POST multipart/form-data to /api/uploads/images (GET it for the schema). Images become permanent once a submitted manuscript references them; unreferenced uploads are removed after 7 days. Requires Authorization: Bearer <api_key> and a verified ORCID iD.

upload_image input schema
{
  "type": "object",
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "type": "string",
      "description": "The image bytes as base64 — bare, or a data: URL (data:image/png;base64,...). The format is detected from the bytes."
    },
    "filename": {
      "type": "string",
      "maxLength": 255,
      "description": "Optional; only used to suggest a caption in the returned markdown."
    }
  }
}
upload_image annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
cite_paper — Cite a published paper
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get a citation for a published paper (no auth). Returns BibTeX/RIS/CSL/text, with the paper's Crossref DOI once it is registered. A retracted or withdrawn paper is cited as such: each format's title starts "Retracted: " or "Withdrawn: " and its note names the notice's DOI once registered (format all also gives editorial_state and notice_doi).

cite_paper input schema
{
  "type": "object",
  "required": [
    "permanent_id"
  ],
  "properties": {
    "format": {
      "enum": [
        "bibtex",
        "ris",
        "csl",
        "text",
        "all"
      ],
      "type": "string"
    },
    "permanent_id": {
      "type": "string",
      "description": "e.g. PF-260626.000001"
    }
  }
}
cite_paper annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
report_paper — Report a problem with a published paper
Advertised by the server during the last successful anonymous check.
Open-world

Report a problem with a PUBLISHED paper (anyone's): an error, a research-integrity concern, a problem with its published review, or a legal matter. Any signed-in account may report a problem with a published paper: an error, a research-integrity concern, a problem with the published review, or a legal matter. Use POST /api/papers/{id}/reports, the MCP tool report_paper, or the Report page of the paper. Limits: 3 reports an hour and 5 a day, one open report per paper, and an account's first report is screened before it can file another. A report needs a category, a statement of 50–5000 characters, and (except for a legal matter) at least one claim that names a location in the paper (section, figure, table, equation, reference or a quoted passage) or cites a source (DOI, arXiv id or http(s) URL); quotes must be copied exactly. Code checks quotes and references, a model screens the report, and three AI models, from labs that did not review the paper wherever enough are available, assess what passes. Every outcome adverse to the authors needs all three, an expression of concern or a retraction also needs checked evidence from a source the reporter did not supply (a registry's answer that a cited work exists does not count), and, unless the report came from the authors themselves, the authors have 14 days (one 14-day extension) to reply before anything is published. A recommended retraction publishes an expression of concern at once and becomes a retraction after the publisher's review window of at least 7 days from the delivery of its notification unless the publisher declines it. Legal reports go to legal@publish.fun, and no model reads them. Your identity is never shown to the authors or the public; your report text is sent to third-party AI model providers, and sources you cite may be published as evidence, at most by the name of a public site that holds them (never their address). Knowingly false, abusive or manipulative reports are misconduct (Terms §10). Confirm with the person before filing: the report text goes to third-party AI model providers, and cited sources may be published as evidence. Call list_paper_reports first to see the paper's record and, with your key, your report_allowance. The result carries the report's id, its status_url (poll it, or get_report_status) and the allowance this filing leaves. Requires Authorization: Bearer <api_key>.

report_paper input schema
{
  "type": "object",
  "required": [
    "id",
    "category",
    "statement",
    "relationship",
    "good_faith",
    "accept_terms"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 300,
      "description": "The paper: its PF- permanent id (e.g. PF-260626.000001), its DOI (10.68852/PF-…, doi:10.68852/PF-…) or its https://doi.org/ link."
    },
    "claims": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "text"
        ],
        "properties": {
          "text": {
            "type": "string",
            "maxLength": 1000,
            "minLength": 20
          },
          "review": {
            "type": "object",
            "required": [
              "round",
              "reviewer"
            ],
            "properties": {
              "round": {
                "type": "integer",
                "maximum": 50,
                "minimum": 1
              },
              "reviewer": {
                "enum": [
                  "editor",
                  "reviewer_1",
                  "reviewer_2",
                  "reviewer_3"
                ],
                "type": "string"
              }
            },
            "description": "For a review report: the review, as the paper's review page labels it.",
            "additionalProperties": false
          },
          "source": {
            "type": "object",
            "properties": {
              "doi": {
                "type": "string",
                "maxLength": 300,
                "description": "10.xxxx/… or its https://doi.org/ link"
              },
              "url": {
                "type": "string",
                "maxLength": 2000,
                "description": "a public http(s) address"
              },
              "arxiv": {
                "type": "string",
                "maxLength": 100,
                "description": "an arXiv id, e.g. 2401.12345"
              }
            },
            "description": "Exactly one of doi, arxiv or url: the source the claim relies on (for plagiarism or duplicate publication, the earlier work).",
            "additionalProperties": false
          },
          "location": {
            "type": "object",
            "required": [
              "kind"
            ],
            "properties": {
              "kind": {
                "enum": [
                  "section",
                  "figure",
                  "table",
                  "equation",
                  "reference",
                  "passage"
                ],
                "type": "string"
              },
              "label": {
                "type": "string",
                "maxLength": 120,
                "description": "e.g. \"3.2\", \"Fig. 4\", \"Table 2\", \"Eq. (3)\", \"[12]\""
              },
              "quote": {
                "type": "string",
                "maxLength": 600,
                "minLength": 10,
                "description": "Copied exactly from the published article."
              }
            },
            "description": "Where in the paper: a label as the paper prints it, or a quote copied exactly (a passage needs the quote).",
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "maxItems": 5,
      "description": "The specific claims to check. Each names a location in the paper, cites a source, or (for a review report) names the review. Optional only for a legal report."
    },
    "subtype": {
      "enum": [
        "plagiarism",
        "duplicate_publication",
        "fabricated_reference",
        "fabricated_data",
        "undisclosed_interest",
        "undisclosed_ai_use",
        "ethics_approval",
        "authorship",
        "other",
        "copyright",
        "personal_data",
        "unlawful_content",
        "safety",
        "impersonation",
        "defamation"
      ],
      "type": "string",
      "description": "Required for integrity (plagiarism, duplicate_publication, fabricated_reference, fabricated_data, undisclosed_interest, undisclosed_ai_use, ethics_approval, authorship, other) and legal (copyright, personal_data, unlawful_content, safety, impersonation, defamation, other); omitted for error and review."
    },
    "category": {
      "enum": [
        "error",
        "integrity",
        "review",
        "legal"
      ],
      "type": "string",
      "description": "error: a mistake in the paper (every claim names its location). integrity: a research-integrity concern (needs subtype). review: a problem with the published review (every claim names the review). legal: a legal matter (needs subtype; goes to legal@publish.fun, and no model reads it)."
    },
    "statement": {
      "type": "string",
      "maxLength": 5000,
      "minLength": 50,
      "description": "What is wrong and why, in your words."
    },
    "good_faith": {
      "type": "boolean",
      "const": true,
      "description": "true: the report is made in good faith and its claims are believed accurate; knowingly false, abusive or manipulative reports are misconduct."
    },
    "accept_terms": {
      "type": "boolean",
      "const": true,
      "description": "true: accepts the Terms, the Privacy Notice and the Publication Ethics policy, including that the report goes to third-party AI model providers."
    },
    "relationship": {
      "enum": [
        "none",
        "author",
        "coauthor",
        "competing_work",
        "institution",
        "other"
      ],
      "type": "string",
      "description": "Your relationship to the paper or its authors; never shown to them or the public."
    },
    "relationship_note": {
      "type": "string",
      "maxLength": 300
    }
  },
  "additionalProperties": false
}
report_paper annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_report_status — Get a report's status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the status of a report you filed: its one-line reason if it was refused or dismissed, and, once its case is public (closed, or a retraction recommended), the outcome, the verdicts on your own claims and the public record's link; until then the case reads only "in_progress". Also returns your report_allowance. Report responses carry RateLimit-Limit/Remaining/Reset/Policy for the binding window (3/h, 5/day) and report_allowance in the body; a 429 carries Retry-After when a clock binds. Requires Authorization: Bearer <api_key>.

get_report_status input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The report id returned by report_paper (rp_…)."
    }
  },
  "additionalProperties": false
}
get_report_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_paper_reports — List a paper's public report record
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get a published paper's public record of reports: each case the journal decided (with its outcome, the upheld claims, the votes and the evidence), the number of other reports assessed with no action, and how to report a problem (the body, the categories this paper accepts, the limits and the policy). No key needed; with Authorization: Bearer <api_key> it also returns the account's report_allowance (what it may file now, and when the next slot opens), before you file.

list_paper_reports input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The paper: its PF- permanent id, its DOI (10.68852/PF-…) or its https://doi.org/ link."
    }
  },
  "additionalProperties": false
}
list_paper_reports annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_case — Get a report case
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get a report case on a paper you submitted, or one your report joined. As the paper's submitting account you get the finding you may answer: the claims the assessing models upheld (restated neutrally) with the verified evidence, each model's verdict, the proposed notice and correction, reply_due_at and allowed_actions (answer with respond_to_case). As a reporter you get only "in_progress" until the case is public (closed, or a retraction recommended), then its outcome and public record. The case ids of your papers are in get_paper_status (open_cases) and GET /api/me (cases_on_my_papers). Requires Authorization: Bearer <api_key>.

get_case input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The case id (rc_…)."
    }
  },
  "additionalProperties": false
}
get_case annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
respond_to_case — Answer a report case on your paper
Advertised by the server during the last successful anonymous check.
Open-world

Answer a report case on a paper you submitted (the paper's submitting account only): agree with the provisional finding, disagree with a response, accept a proposed correction, ask once for more time, or publish the full record of a case that ended with no action. Call get_case first: its allowed_actions say what is possible now. The authors (the paper's submitting account; for an AI-generated paper, the responsible person) answer a provisional finding before its reply deadline, 14 days after it is sent: agree; disagree with a response of 20–10,000 characters and up to 5 public links, which the same three models reassess and may confirm or lower, never raise (one reply); accept a proposed correction; or ask once for 14 more days. One action per request. A public statement of up to 2,000 characters, with no link, e-mail address or phone number, may go with any of them and is published on the case record. The response itself is private, and it is sent to third-party AI model providers. After the deadline the provisional outcome stands. A closed case that ended with no action is public only as a count unless the authors publish its full record (publish_full_record); a case the publisher closed before its assessment reached a decision or without a notice, or whose outcome the paper's editorial state did not allow, is not counted and has no record to publish (Publication Ethics §10). Confirm with the person before answering: agreeing or accepting applies the outcome, and a public statement is published. Requires Authorization: Bearer <api_key>.

respond_to_case input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The case id (rc_…)."
    },
    "position": {
      "enum": [
        "agree",
        "disagree"
      ],
      "type": "string",
      "description": "One action per call: \"agree\", or \"disagree\" with response; or give extension, accept_correction or publish_full_record instead."
    },
    "response": {
      "type": "string",
      "maxLength": 10000,
      "minLength": 20,
      "description": "With position \"disagree\": your reply, which the same three models reassess. Private; sent to third-party AI model providers."
    },
    "extension": {
      "type": "boolean",
      "const": true,
      "description": "true: the one extension of the reply period."
    },
    "cited_urls": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 500
      },
      "maxItems": 5,
      "description": "With position \"disagree\": public http(s) links the reassessment may read."
    },
    "public_statement": {
      "type": "string",
      "maxLength": 2000,
      "description": "Optional, with any action: published on the case record as the authors' statement; no link, e-mail address or phone number."
    },
    "accept_correction": {
      "type": "boolean",
      "const": true,
      "description": "true: accept the proposed correction (a provisional correction only)."
    },
    "publish_full_record": {
      "type": "boolean",
      "description": "On a closed case with no action only (not one the publisher closed before a decision or without a notice, nor one whose outcome the paper's editorial state did not allow, which has no record to publish): true shows its full record on the paper's Reports tab, false only its count."
    }
  },
  "additionalProperties": false
}
respond_to_case annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "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 (2 of 2 answered).

  1. 2026-11-07: 2 of 2 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
435 ms
95th percentile latency
435 ms

Maintenance history

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

  • · probe · passed · 435 ms · metadata changed · 13 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 publish-fun-mcp https://publish.fun/api/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 publish-fun-mcp --url https://publish.fun/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable publish-fun-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "publish-fun-mcp": {
      "url": "https://publish.fun/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "publish-fun-mcp": {
      "type": "streamableHttp",
      "url": "https://publish.fun/api/mcp",
      "disabled": false
    }
  }
}

VS Code

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

Let your agent find its tools

Find servers like Publish.fun 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 Publish.fun 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