Skip to main content
Glama

get_institutional_link

Read-onlyIdempotent

Generate an OpenURL from a PMID, DOI, or article metadata so your library's resolver can route you to full-text access.

Instructions

Generate institutional access link (OpenURL) for an article.

═══════════════════════════════════════════════════════════════════════════════ 🔗 GET LIBRARY ACCESS LINK ═══════════════════════════════════════════════════════════════════════════════

Generate an OpenURL that will take you through your library's link resolver to access the full text of an article.

PREREQUISITES: ───────────────── Must first call configure_institutional_access() to set up your resolver.

USAGE: ─────────────────

With PMID (easiest): get_institutional_link( source={"kind": "pmid", "value": "38353755"} )

With DOI: get_institutional_link( source={"kind": "doi", "value": "10.1001/jama.2024.1234"} )

With full metadata (most reliable): get_institutional_link( source={ "kind": "metadata", "title": "Some Article Title", "journal": "JAMA", "year": 2024, "volume": "331", "issue": "1", "pages": "45-52" } )

Args: source: Exactly one explicit PMID, DOI, or bounded metadata object.

Returns: OpenURL link or error message

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sourceYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed26 schema fields changedv0.7.7
    • addedInput schema / $defs / DOISource / properties / kind / anyOf
      Added value: +[
      +  {
      +    "const": "doi",
      +    "title": "Kind",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[dD][oO][iI])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / DOISource / properties / kind / const
      Removed value: -"doi"
    • removedInput schema / $defs / DOISource / properties / kind / type
      Removed value: -"string"
    • addedInput schema / $defs / DOISource / properties / value / description
      Added value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers."
    • addedInput schema / $defs / DOISource / properties / value / examples
      Added value: +[
      +  "10.1000/example",
      +  "doi:10.1000/example",
      +  "https://doi.org/10.1000/example"
      +]
    • addedInput schema / $defs / DOISource / properties / value / format
      Added value: +"pubmed-doi"
    • changedInput schema / $defs / DOISource / properties / value / minLength
      Previous value: -7New value: +1
    • removedInput schema / $defs / DOISource / properties / value / pattern
      Removed value: -"^10\\.[0-9]{4,9}/"
    • addedInput schema / $defs / DOISource / properties / value / x-pubmed-input
      Added value: +"doi"
    • addedInput schema / $defs / InstitutionalMetadataSource / properties / kind / anyOf
      Added value: +[
      +  {
      +    "const": "metadata",
      +    "title": "Kind",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[mM][eE][tT][aA][dD][aA][tT][aA])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / InstitutionalMetadataSource / properties / kind / const
      Removed value: -"metadata"
    • removedInput schema / $defs / InstitutionalMetadataSource / properties / kind / type
      Removed value: -"string"
    • changedInput schema / $defs / InstitutionalMetadataSource / properties / year / anyOf
      Previous value: -[
      -  {
      -    "maximum": 9999,
      -    "minimum": 1000,
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 9999,
      +    "minimum": 1000,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  },
      +  {
      +    "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.",
      +    "maxLength": 32,
      +    "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • addedInput schema / $defs / PMIDSource / properties / kind / anyOf
      Added value: +[
      +  {
      +    "const": "pmid",
      +    "title": "Kind",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][iI][dD])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / PMIDSource / properties / kind / const
      Removed value: -"pmid"
    • removedInput schema / $defs / PMIDSource / properties / kind / type
      Removed value: -"string"
    • addedInput schema / $defs / PMIDSource / properties / value / description
      Added value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers."
    • addedInput schema / $defs / PMIDSource / properties / value / examples
      Added value: +[
      +  "33053718",
      +  "PMID:33053718",
      +  "https://pubmed.ncbi.nlm.nih.gov/33053718/"
      +]
    • addedInput schema / $defs / PMIDSource / properties / value / format
      Added value: +"pubmed-pmid"
    • changedInput schema / $defs / PMIDSource / properties / value / maxLength
      Previous value: -20New value: +512
    • addedInput schema / $defs / PMIDSource / properties / value / minLength
      Added value: +1
    • removedInput schema / $defs / PMIDSource / properties / value / pattern
      Removed value: -"^[1-9][0-9]{0,19}$"
    • addedInput schema / $defs / PMIDSource / properties / value / x-pubmed-input
      Added value: +"pmid"
    • addedInput schema / properties / source / anyOf
      Added value: +[
      +  {
      +    "discriminator": {
      +      "mapping": {
      +        "doi": "#/$defs/DOISource",
      +        "metadata": "#/$defs/InstitutionalMetadataSource",
      +        "pmid": "#/$defs/PMIDSource"
      +      },
      +      "propertyName": "kind"
      +    },
      +    "oneOf": [
      +      {
      +        "$ref": "#/$defs/PMIDSource"
      +      },
      +      {
      +        "$ref": "#/$defs/DOISource"
      +      },
      +      {
      +        "$ref": "#/$defs/InstitutionalMetadataSource"
      +      }
      +    ],
      +    "title": "Source"
      +  },
      +  {
      +    "contentMediaType": "application/json",
      +    "contentSchema": {
      +      "discriminator": {
      +        "mapping": {
      +          "doi": "#/$defs/DOISource",
      +          "metadata": "#/$defs/InstitutionalMetadataSource",
      +          "pmid": "#/$defs/PMIDSource"
      +        },
      +        "propertyName": "kind"
      +      },
      +      "oneOf": [
      +        {
      +          "$ref": "#/$defs/PMIDSource"
      +        },
      +        {
      +          "$ref": "#/$defs/DOISource"
      +        },
      +        {
      +          "$ref": "#/$defs/InstitutionalMetadataSource"
      +        }
      +      ],
      +      "title": "Source"
      +    },
      +    "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.",
      +    "maxLength": 1000000,
      +    "type": "string"
      +  },
      +  {
      +    "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.",
      +    "maxLength": 1000000,
      +    "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$",
      +    "type": "string",
      +    "x-pubmed-decodedSchema": {
      +      "discriminator": {
      +        "mapping": {
      +          "doi": "#/$defs/DOISource",
      +          "metadata": "#/$defs/InstitutionalMetadataSource",
      +          "pmid": "#/$defs/PMIDSource"
      +        },
      +        "propertyName": "kind"
      +      },
      +      "oneOf": [
      +        {
      +          "$ref": "#/$defs/PMIDSource"
      +        },
      +        {
      +          "$ref": "#/$defs/DOISource"
      +        },
      +        {
      +          "$ref": "#/$defs/InstitutionalMetadataSource"
      +        }
      +      ],
      +      "title": "Source"
      +    },
      +    "x-pubmed-encoding": "fenced-json"
      +  }
      +]
    • removedInput schema / properties / source / discriminator
      Removed value: -{
      -  "mapping": {
      -    "doi": "#/$defs/DOISource",
      -    "metadata": "#/$defs/InstitutionalMetadataSource",
      -    "pmid": "#/$defs/PMIDSource"
      -  },
      -  "propertyName": "kind"
      -}
    • removedInput schema / properties / source / oneOf
      Removed value: -[
      -  {
      -    "$ref": "#/$defs/PMIDSource"
      -  },
      -  {
      -    "$ref": "#/$defs/DOISource"
      -  },
      -  {
      -    "$ref": "#/$defs/InstitutionalMetadataSource"
      -  }
      -]
  2. Changed13 schema fields changedv0.7.2
    • addedInput schema / $defs
      Added value: +{
      +  "DOISource": {
      +    "additionalProperties": false,
      +    "description": "An explicit DOI.",
      +    "properties": {
      +      "kind": {
      +        "const": "doi",
      +        "title": "Kind",
      +        "type": "string"
      +      },
      +      "value": {
      +        "maxLength": 512,
      +        "minLength": 7,
      +        "pattern": "^10\\.[0-9]{4,9}/",
      +        "title": "Value",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "value"
      +    ],
      +    "title": "DOISource",
      +    "type": "object"
      +  },
      +  "InstitutionalMetadataSource": {
      +    "additionalProperties": false,
      +    "description": "Bounded journal metadata used to construct an OpenURL.",
      +    "properties": {
      +      "issue": {
      +        "anyOf": [
      +          {
      +            "maxLength": 50,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Issue"
      +      },
      +      "journal": {
      +        "anyOf": [
      +          {
      +            "maxLength": 300,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Journal"
      +      },
      +      "kind": {
      +        "const": "metadata",
      +        "title": "Kind",
      +        "type": "string"
      +      },
      +      "pages": {
      +        "anyOf": [
      +          {
      +            "maxLength": 100,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Pages"
      +      },
      +      "title": {
      +        "maxLength": 1000,
      +        "minLength": 1,
      +        "title": "Title",
      +        "type": "string"
      +      },
      +      "volume": {
      +        "anyOf": [
      +          {
      +            "maxLength": 50,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Volume"
      +      },
      +      "year": {
      +        "anyOf": [
      +          {
      +            "maximum": 9999,
      +            "minimum": 1000,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Year"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "title"
      +    ],
      +    "title": "InstitutionalMetadataSource",
      +    "type": "object"
      +  },
      +  "PMIDSource": {
      +    "additionalProperties": false,
      +    "description": "An explicit PubMed identifier.",
      +    "properties": {
      +      "kind": {
      +        "const": "pmid",
      +        "title": "Kind",
      +        "type": "string"
      +      },
      +      "value": {
      +        "maxLength": 20,
      +        "pattern": "^[1-9][0-9]{0,19}$",
      +        "title": "Value",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "value"
      +    ],
      +    "title": "PMIDSource",
      +    "type": "object"
      +  }
      +}
    • addedInput schema / additionalProperties
      Added value: +false
    • removedInput schema / properties / doi
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Doi"
      -}
    • removedInput schema / properties / issue
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Issue"
      -}
    • removedInput schema / properties / journal
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Journal"
      -}
    • removedInput schema / properties / pages
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Pages"
      -}
    • removedInput schema / properties / pmid
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Pmid"
      -}
    • addedInput schema / properties / source
      Added value: +{
      +  "discriminator": {
      +    "mapping": {
      +      "doi": "#/$defs/DOISource",
      +      "metadata": "#/$defs/InstitutionalMetadataSource",
      +      "pmid": "#/$defs/PMIDSource"
      +    },
      +    "propertyName": "kind"
      +  },
      +  "oneOf": [
      +    {
      +      "$ref": "#/$defs/PMIDSource"
      +    },
      +    {
      +      "$ref": "#/$defs/DOISource"
      +    },
      +    {
      +      "$ref": "#/$defs/InstitutionalMetadataSource"
      +    }
      +  ],
      +  "title": "Source"
      +}
    • removedInput schema / properties / title
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Title"
      -}
    • removedInput schema / properties / volume
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Volume"
      -}
    • removedInput schema / properties / year
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Year"
      -}
    • addedInput schema / required
      Added value: +[
      +  "source"
      +]
    • changedOutput schema / (root)
      Previous value: -{
      -  "properties": {
      -    "result": {
      -      "title": "Result",
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "result"
      -  ],
      -  "title": "get_institutional_linkOutput",
      -  "type": "object"
      -}New value: +null
  3. First observedv0.5.16

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false. The description adds the prerequisite dependency on configure_institutional_access, which is useful behavioral context beyond annotations. It also notes the return is a link or error message.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections, but it includes decorative ASCII art and emojis that add length without informational value. The core content is efficient and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the parameter (a discriminated union with multiple formats) and the lack of schema descriptions, the description provides complete information needed to call the tool correctly, including prerequisites, formats, and return type.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must clarify the parameter. It does so thoroughly by showing three different formats for the 'source' parameter with concrete examples, explaining that exactly one explicit PMID, DOI, or bounded metadata object is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: generating an OpenURL institutional access link for an article. It clearly distinguishes itself from siblings like configure_institutional_access or test_institutional_access by focusing on link generation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It includes a PREREQUISITES section requiring configure_institutional_access(), and provides concrete usage examples for PMID, DOI, and metadata. It doesn't explicitly state when not to use it, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.