# `crossref__crossref_get_references`

**Get Reference List**

Returns the outgoing reference list for a DOI — the works cited by this paper. Each reference includes the deposited citation string and, where Crossref has resolved it, a DOI you can look up with crossref_get_work. Results are paged: referenceCount is the full deposited total, and when more remain the response carries a nextOffset to pass back as offset. Reference list coverage varies by publisher; many older works and non-participating publishers have no indexed references. Incoming citations — the works that cite this paper — are not available through Crossref; use OpenAlex for that.

- Server: [Crossref](https://gateway.mcpharbor.dev/docs/servers/crossref) (`dev.mcpharbor.gateway/crossref`)
- Price per call: $0.0001 (100 micro-USD); only tools/call is charged
- Endpoint: `https://gateway.mcpharbor.dev/mcp` or `https://gateway.mcpharbor.dev/mcp/crossref`
- Upstream tool: exposed by the provider; called through this gateway as `crossref__crossref_get_references`
- Provider terms: <https://www.crossref.org/documentation/retrieve-metadata/rest-api/access-and-authentication/> (verified 2026-09-19)
- Upstream API documentation: <https://www.crossref.org/documentation/retrieve-metadata/rest-api/>
- Rate limit: 50 requests per minute

## Parameters

- `doi` (string, required): DOI in the format "10.NNNN/suffix", e.g. "10.1038/nature12373". Must start with "10." followed by 4–9 digits and a slash.
- `limit` (integer, optional): Maximum number of references to return in one page (1–500, default 100). Most works fit in a single page; bibliography records can carry tens of thousands. Default: `100`.
- `offset` (integer, optional): Zero-based index of the first reference to return. Pass the nextOffset value from the previous response to continue through a long reference list. Default: `0`.

## Example call

Request headers and body:

```http
POST /mcp HTTP/1.1
Host: gateway.mcpharbor.dev
Authorization: Bearer <your gateway API key>
Content-Type: application/json
Accept: application/json, text/event-stream
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: crossref__crossref_get_references
```

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "_meta": {
      "io.modelcontextprotocol/clientCapabilities": {},
      "io.modelcontextprotocol/clientInfo": {
        "name": "example-agent",
        "version": "1.0.0"
      },
      "io.modelcontextprotocol/protocolVersion": "2026-07-28"
    },
    "arguments": {
      "doi": "example"
    },
    "name": "crossref__crossref_get_references"
  }
}
```

A successful response:

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "_meta": {
      "dev.mcpharbor.gateway/call": {
        "chargedMicroUsd": 100,
        "id": "<the id of this charge>"
      }
    },
    "content": [
      {
        "text": "<whatever the upstream tool returned>",
        "type": "text"
      }
    ],
    "resultType": "complete"
  }
}
```

This call costs $0.0001 (100 micro-USD). Reading this page and listing the tool cost nothing.
The `dev.mcpharbor.gateway/call` record in the result is the receipt for that charge. Each
POST is metered separately, so sending the same call again buys another one: see
[agent.txt](https://gateway.mcpharbor.dev/agent.txt), section 7, before retrying.

## Attribution

This provider asks for no attribution. Their terms still apply: see the table above.

## Tool definition

Exactly as `tools/list` returns it (free):

```json
{
  "_meta": {
    "dev.mcpharbor.gateway/pricing": {
      "currency": "USD",
      "pricePerCallMicroUsd": 100
    }
  },
  "annotations": {
    "idempotentHint": true,
    "readOnlyHint": true
  },
  "description": "Returns the outgoing reference list for a DOI — the works cited by this paper. Each reference includes the deposited citation string and, where Crossref has resolved it, a DOI you can look up with crossref_get_work. Results are paged: referenceCount is the full deposited total, and when more remain the response carries a nextOffset to pass back as offset. Reference list coverage varies by publisher; many older works and non-participating publishers have no indexed references. Incoming citations — the works that cite this paper — are not available through Crossref; use OpenAlex for that.",
  "inputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false,
    "properties": {
      "doi": {
        "description": "DOI in the format \"10.NNNN/suffix\", e.g. \"10.1038/nature12373\". Must start with \"10.\" followed by 4–9 digits and a slash.",
        "pattern": "^10\\.\\d{4,9}\\/\\S+$",
        "type": "string"
      },
      "limit": {
        "default": 100,
        "description": "Maximum number of references to return in one page (1–500, default 100). Most works fit in a single page; bibliography records can carry tens of thousands.",
        "maximum": 500,
        "minimum": 1,
        "type": "integer"
      },
      "offset": {
        "default": 0,
        "description": "Zero-based index of the first reference to return. Pass the nextOffset value from the previous response to continue through a long reference list.",
        "maximum": 9007199254740991,
        "minimum": 0,
        "type": "integer"
      }
    },
    "required": [
      "doi"
    ],
    "type": "object"
  },
  "name": "crossref__crossref_get_references",
  "outputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false,
    "anyOf": [
      {
        "not": {
          "required": [
            "error"
          ]
        },
        "required": [
          "doi",
          "referenceCount",
          "offset",
          "references"
        ]
      },
      {
        "required": [
          "error"
        ]
      }
    ],
    "properties": {
      "cap": {
        "description": "The limit that was applied to this page.",
        "type": "number"
      },
      "doi": {
        "description": "DOI of the citing work",
        "type": "string"
      },
      "error": {
        "additionalProperties": {},
        "description": "Present when the call failed. Absent on success.",
        "properties": {
          "code": {
            "description": "JSON-RPC error code for this failure.",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "data": {
            "additionalProperties": {},
            "properties": {
              "reason": {
                "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: Crossref answered HTTP 429 and the limit did not clear inside the retry budget. `upstream_unavailable`: Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON. `malformed_response`: Crossref returned HTTP 200 with a body that is not valid JSON. `request_timeout`: Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504. `doi_not_found`: Valid DOI format but no Crossref record exists. Other values are possible when a failure originates below the handler.",
                "examples": [
                  "rate_limited",
                  "upstream_unavailable",
                  "malformed_response",
                  "request_timeout",
                  "doi_not_found"
                ],
                "type": "string"
              },
              "recovery": {
                "additionalProperties": {},
                "description": "Actionable next step for the caller.",
                "properties": {
                  "hint": {
                    "type": "string"
                  }
                },
                "required": [
                  "hint"
                ],
                "type": "object"
              },
              "retryable": {
                "description": "Whether retrying may succeed.",
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "message": {
            "description": "Human-readable description of what went wrong.",
            "type": "string"
          }
        },
        "required": [
          "code",
          "message"
        ],
        "type": "object"
      },
      "nextOffset": {
        "description": "Offset to pass in the next call to retrieve the following page. Absent when this page reaches the end of the reference list.",
        "type": "number"
      },
      "notice": {
        "description": "Coverage guidance when no references are indexed, or a range explanation when the requested offset is past the end of the list. Absent on a normal page.",
        "type": "string"
      },
      "offset": {
        "description": "Zero-based index of the first returned reference within the deposited list",
        "type": "number"
      },
      "referenceCount": {
        "description": "Total number of references in the deposited list",
        "type": "number"
      },
      "references": {
        "description": "Page of the outgoing reference list",
        "items": {
          "additionalProperties": false,
          "description": "Reference entry",
          "properties": {
            "articleTitle": {
              "description": "Article title of the referenced work, with inline formatting markup removed",
              "type": "string"
            },
            "author": {
              "description": "Author field from the reference entry, with inline formatting markup removed",
              "type": "string"
            },
            "doi": {
              "description": "Resolved DOI for this reference, when available",
              "type": "string"
            },
            "firstPage": {
              "description": "First page",
              "type": "string"
            },
            "issn": {
              "description": "ISSN of the referenced journal",
              "type": "string"
            },
            "journalTitle": {
              "description": "Journal title of the referenced work, with inline formatting markup removed",
              "type": "string"
            },
            "key": {
              "description": "Reference key as deposited",
              "type": "string"
            },
            "unstructured": {
              "description": "Citation string as deposited by the publisher, with formatting markup and structured-citation tags removed. Angle-bracketed text that is not recognizable as markup — a cited URL, a Miller index, a DOI fragment — is left exactly as deposited, and so is a link whose href holds an address the text it wraps does not already carry.",
              "type": "string"
            },
            "volume": {
              "description": "Volume",
              "type": "string"
            },
            "year": {
              "description": "Publication year of the referenced work",
              "type": "string"
            }
          },
          "type": "object"
        },
        "type": "array"
      },
      "shown": {
        "description": "Number of references returned in this page.",
        "type": "number"
      },
      "truncated": {
        "description": "True when references remain beyond this page. Absent when the page is the last.",
        "type": "boolean"
      }
    },
    "type": "object"
  },
  "title": "Get Reference List"
}
```
