Skip to main content
Glama
AM253906
by AM253906

metrc-mcp

An MCP (Model Context Protocol) server for the METRC cannabis track-and-trace API, focused on the workflows a processor/manufacturer actually runs day to day: checking active package inventory, resolving tags, reconciling transfer manifests, and pulling lab test results.

I built this after several years running licensed processing operations, where "check METRC" is a dozen-times-a-day interruption. Wrapping the API as MCP tools lets an assistant answer questions like "which of our active packages are still awaiting lab results?" or "reconcile yesterday's incoming manifest against what we received" directly against the compliance system of record.

Scope

This deliberately does not wrap the full METRC API. METRC exposes a couple hundred endpoints across cultivation, retail, and processing; most integrations touch a small fraction. This server covers the processor slice:

Tool

What it does

list_facilities

Facilities visible to your user key, with license numbers

list_active_packages

Active inventory with testing state and hold status

get_package

Full record for one package by tag label

finish_package

Mark a zero-quantity package finished (write, gated)

list_items

The item catalog packages are created against

list_incoming_transfers / list_outgoing_transfers

Manifests in and out

get_lab_test_results

Test results for a package by numeric ID

Cultivation (plants, harvests) and retail (sales receipts) endpoints are out of scope. Adding a domain means one new file in src/tools/.

Related MCP server: @smart-compost/mcp

Safety model

METRC is a legal record. Mistakes in it are compliance findings, not bugs.

  • Read-only by default. Write tools throw unless METRC_ALLOW_WRITES=true is set explicitly.

  • Sandbox support. Set METRC_SANDBOX=true to target your state's sandbox instance. Do not enable writes against a production license until the workflow has been tested there.

  • Bounded output. List tools cap at 100 rows and say so, rather than flooding the model's context with a busy facility's full inventory.

METRC auth, briefly

METRC deploys per state (api-ok.metrc.com, api-ca.metrc.com, ...) and authenticates with HTTP Basic where the username is the software vendor's API key and the password is the user's API key. The vendor key identifies the integrator; the user key determines which facilities you can see. Both are required. This trips up most first-time integrators, who expect a single bearer token.

Endpoint paths and payload fields can differ slightly between states and API versions. This server targets the v2 endpoints; if your state lags on a particular resource, the 404 error message will say which path failed.

Setup

npm install
npm run build

Configure via environment (see .env.example):

METRC_STATE=ok                  # two-letter state code
METRC_VENDOR_API_KEY=...        # from your METRC vendor account
METRC_USER_API_KEY=...          # from your METRC user profile
METRC_LICENSE_NUMBER=...        # optional default license
METRC_SANDBOX=true              # strongly recommended to start
METRC_ALLOW_WRITES=false        # keep false until tested

Register with an MCP client (Claude Desktop shown):

{
  "mcpServers": {
    "metrc": {
      "command": "node",
      "args": ["/path/to/metrc-mcp/dist/index.js"],
      "env": {
        "METRC_STATE": "ok",
        "METRC_VENDOR_API_KEY": "...",
        "METRC_USER_API_KEY": "...",
        "METRC_SANDBOX": "true"
      }
    }
  }
}

Testing

npm test

METRC vendor sandbox access requires completing METRC's training and API User Agreement process, so this client is validated against a mocked METRC instance instead (test/mock-metrc.ts), with payloads shaped like the real v2 responses. The suite covers two layers:

  • Client tests — Basic auth construction (vendor key as username, user key as password), query serialization, 429 retry with backoff and eventual surfacing, normalization of METRC's inconsistent error shapes, and license resolution.

  • End-to-end stdio tests — the compiled server is spawned as a real MCP process and driven over JSON-RPC, the same path Claude Desktop uses. These verify tool registration, response summarization, readable tool-level errors, and that write tools are refused in read-only mode before any network call is attempted.

METRC_BASE_URL exists solely as the test hook that points the client at the mock.

Development

npm run dev        # run from source via tsx
npm run build      # compile to dist/

The layering is: src/metrc/client.ts owns HTTP, auth, timeouts, and 429 retry; src/tools/* define MCP tools per domain and summarize responses; src/config.ts validates environment once at startup. Tool handlers never touch fetch directly.

License

MIT

Available Tools

8 tools
finish_packageFinish package (write)A

Mark a zero-quantity package as finished, removing it from active inventory. This modifies the state compliance record. Requires METRC_ALLOW_WRITES=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelYesThe package tag label to finish.
actualDateYesFinish date, YYYY-MM-DD.
licenseNumberNoFacility license number. Omit to use METRC_LICENSE_NUMBER.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description discloses important behavioral traits: it modifies the state compliance record, removes the package from active inventory, and requires a write flag. This goes well beyond the tool name, though it does not cover reversibility or failure behavior.

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

Conciseness5/5

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

Two sentences with no filler. The core action and effect are front-loaded, and the prerequisite is stated immediately after, making it easy for an agent to parse quickly.

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

Completeness4/5

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

For a mutation tool with no annotations and no output schema, the description covers the key facts: what it does, what it affects, and the required configuration. Missing edge cases like 'already finished' or non-zero quantity are not critical for correct invocation.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all parameters. The description adds the zero-quantity context but does not add meaning to individual parameters beyond what the schema provides, so the baseline of 3 is appropriate.

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?

States a specific verb ('Mark'), the resource ('a zero-quantity package'), and the effect ('removing it from active inventory'). It clearly distinguishes itself from the read/list siblings like list_active_packages and get_package.

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?

Provides clear context: the tool is for zero-quantity packages and requires METRC_ALLOW_WRITES=true. It does not explicitly name alternatives or state when not to use it, but the intended use is evident and the condition is concrete.

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

get_lab_test_resultsGet lab test resultsA

Fetch lab test results for a package by its numeric package ID (not the tag label — use get_package first to resolve the ID). Returns test type, pass/fail, measured level, and testing lab.

ParametersJSON Schema
NameRequiredDescriptionDefault
packageIdYesNumeric METRC package ID.
licenseNumberNoFacility license number. Omit to use METRC_LICENSE_NUMBER.

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It does describe the returned fields (test type, pass/fail, measured level, testing lab) and clarifies the ID requirement, but it does not mention read-only behavior, error cases, or pagination. It is adequate but not comprehensive.

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

Conciseness5/5

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

Two sentences contain exactly the needed information: the action, the critical ID caveat with its resolution path, and the returned fields. Every sentence earns its place and the key constraint is front-loaded.

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

Completeness4/5

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

Given there is no output schema, the description lists the return fields sufficiently. It covers the required parameters, the prerequisite for resolving package IDs, and the tool's purpose. Minor gaps like potential multiple results or authentication remain, but for a read-only fetch tool this is reasonably complete.

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

Parameters4/5

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

Schema coverage is 100% for both parameters, so the schema already documents their types and defaults. The description adds one important semantic distinction beyond the schema: the packageId is numeric and must not be confused with the tag label, which requires resolving via get_package first. This adds real value beyond structured data.

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 uses a specific verb ('Fetch'), a clear resource ('lab test results'), and a precise input ('numeric package ID'). It explicitly clarifies that the ID is not the tag label, distinguishing this from tag-based lookups and preventing common misuse.

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?

The description gives a clear prerequisite: use get_package first to resolve the numeric package ID, steering the agent away from tag labels. It does not explicitly state when to prefer this over sibling list tools, but the context is clear enough for a simple fetch operation.

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

get_packageGet package by labelA

Look up a single package by its METRC tag label (e.g. 1A4FF0100000022000000123) and return its full record, including source and testing details.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelYesThe package tag label.
licenseNumberNoFacility license number. Omit to use METRC_LICENSE_NUMBER.

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the burden is on the description to explain behavior. It does disclose that this is a lookup operation returning a full package record including source and testing details, but it stays silent on possible not-found behavior, default license handling, or whether any side effects occur.

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

Conciseness5/5

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

The description is a single efficient sentence with no filler. It front-loads the key action and resource, gives a useful example, and ends with return-value context. Every element earns its place.

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

Completeness4/5

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

For a simple lookup with two parameters, no output schema, and no nested objects, the description is sufficient. It names the return content, provides a label format example, and the schema covers the optional licenseNumber behavior. Minor gaps like not-found semantics are acceptable for such a straightforward read operation.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by providing a concrete METRC tag label example and emphasizing that the label parameter is the lookup key, which clarifies the expected input format beyond the schema's generic 'package tag label.'

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 clearly states the specific operation: look up a single package by its METRC tag label. It also states what is returned (full record with source and testing details), making it easy to distinguish from sibling list tools or finish_package.

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?

The description clearly implies this tool is for fetching one specific package when a label is already known. It does not explicitly mention when to prefer list_active_packages or get_lab_test_results instead, but the 'single package by label' framing provides clear usage context.

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

list_active_packagesList active packagesA

List active (unfinished) packages at a facility: label, item, quantity, lab testing state, and hold status. This is the day-to-day inventory view for a processor.

ParametersJSON Schema
NameRequiredDescriptionDefault
licenseNumberNoFacility license number. Omit to use METRC_LICENSE_NUMBER.
lastModifiedEndNoISO 8601 date. Only packages modified on/before this date.
lastModifiedStartNoISO 8601 date. Only packages modified on/after this date.

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It clarifies that 'active' means unfinished and names the included fields, but it does not explicitly state read-only behavior, pagination, or default facility resolution. This is partial but not misleading.

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

Conciseness5/5

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

The description is two sentences with no filler. The action, scope, and returned fields are front-loaded, and the context line about being a processor's inventory view earns its place.

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

Completeness4/5

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

For a simple filtered-list tool, the description adequately covers resource semantics and returned fields, while the schema fully documents parameters. It could add pagination or default behavior details since there is no output schema, but the current text is sufficient for correct selection and invocation.

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

Parameters3/5

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

The input schema covers all three parameters with descriptions, including the licenseNumber default behavior and the lastModified date range semantics. The tool description adds no parameter-level detail, so the schema carries the full weight, matching the baseline.

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 action ('List'), a defined resource ('active (unfinished) packages at a facility'), and enumerates the returned fields (label, item, quantity, lab testing state, hold status). This clearly distinguishes it from sibling tools like list_items or get_package.

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

Usage Guidelines3/5

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

The phrase 'day-to-day inventory view for a processor' gives a useful usage context, and 'active (unfinished)' defines the scope. However, it does not explicitly explain when to choose this over siblings such as get_package or list_items, nor mention any exclusions.

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

list_facilitiesList facilitiesA

List the facilities the configured METRC user key can access, with license numbers and license types. Call this first if you don't know which license number to use for other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

No annotations exist, so the description carries the behavioral burden. It clarifies that results are restricted to what the configured user key can access and states the return contents. It does not disclose potential rate limits or pagination, but for a simple read-only list tool, the behavior is sufficiently transparent.

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

Conciseness5/5

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

The description is two sentences with no filler. The first sentence front-loads the action and scope, and the second provides a clear usage trigger. Every word earns its place.

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?

For a zero-parameter, no-annotations, no-output-schema tool, the description is complete: it states what is listed, under what access scope, what fields are returned, and when to call it first. There is no missing information an agent would reasonably need to invoke this tool correctly.

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

Parameters4/5

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

The tool has zero parameters, so there is no parameter burden for the description to carry. The description adds value by explaining the output (license numbers and license types), which is beyond the empty schema.

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 uses a specific verb and resource ('List the facilities') and adds meaningful scope: facilities accessible by the configured METRC user key, with license numbers and license types. This clearly distinguishes it from sibling tools that operate on packages, items, lab tests, or transfers.

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?

The description gives a clear conditional trigger: 'Call this first if you don't know which license number to use for other tools.' This tells the agent when the tool is valuable, though it does not explicitly name alternatives or state when not to call it.

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

list_incoming_transfersList incoming transfersA

List incoming transfers for a facility: manifest number, shipper, and package count. Useful for reconciling deliveries against manifests.

ParametersJSON Schema
NameRequiredDescriptionDefault
licenseNumberNoFacility license number. Omit to use METRC_LICENSE_NUMBER.

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It explains what the tool returns and its purpose, but does not disclose pagination behavior, response format, license-number resolution, or error conditions.

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

Conciseness5/5

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

The description is two short sentences, front-loaded with the core action and valuable result details, with no redundant or filler content.

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

Completeness4/5

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

This is a simple one-optional-parameter listing tool with no output schema. The description covers the resource, scope, and representative returned fields. Additional behavioral details like pagination or sorting would improve completeness but are not strictly necessary to call it.

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

Parameters3/5

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

The single parameter licenseNumber is fully described in the schema, so schema coverage is 100%. The description adds no new semantic detail beyond tying the transfer list to a facility, matching the baseline for covered parameters.

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 ('List incoming transfers') and names the key fields returned (manifest number, shipper, package count). The word 'incoming' clearly distinguishes it from the sibling tool list_outgoing_transfers.

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?

The description gives a clear use case: 'reconciling deliveries against manifests.' It does not explicitly contrast with list_outgoing_transfers or specify when not to use this tool, but the context is evident enough for an agent.

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

list_itemsList itemsA

List the facility's item catalog (the product definitions packages are created against): name, category, and unit of measure.

ParametersJSON Schema
NameRequiredDescriptionDefault
licenseNumberNoFacility license number. Omit to use METRC_LICENSE_NUMBER.

TDQS

A3.6/5.0
Behavior3/5

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

The verb 'List' implies a read-only operation and the description scopes the data to 'the facility's item catalog' while naming returned attributes. However, with no annotations provided, the description does not disclose pagination, ordering, or whether the full catalog is always returned, leaving some behavioral ambiguity.

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

Conciseness5/5

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

The description is a single focused sentence with no filler. It front-loads the action, includes a useful parenthetical clarification, and each part earns its place.

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

Completeness4/5

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

Given the tool has one optional parameter and no output schema, the description sufficiently conveys the return shape by listing name, category, and unit of measure. A note on pagination or full-catalog behavior would make it fully complete, but the current level is adequate for this simple list tool.

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

Parameters3/5

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

Schema description coverage is 100% for the single optional licenseNumber parameter, including the fallback to METRC_LICENSE_NUMBER. The description adds no parameter-specific detail, but the baseline of 3 applies because the schema already fully documents the only parameter.

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 uses a specific verb and resource: 'List the facility's item catalog' and clarifies what items are with 'product definitions packages are created against.' It also names the returned fields, and the tool is clearly distinct from sibling tools like list_active_packages and get_package.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus alternatives, nor are any exclusions or conditional routing provided. The intended use is only implied by the description of what it lists.

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

list_outgoing_transfersList outgoing transfersA

List outgoing transfers for a facility: manifest number, recipient, and package count.

ParametersJSON Schema
NameRequiredDescriptionDefault
licenseNumberNoFacility license number. Omit to use METRC_LICENSE_NUMBER.

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the transparency burden. The verb 'List' signals a non-destructive read operation, and the description states the output fields. It does not mention pagination, ordering, transfer status filtering, or permission requirements, but these are moderate gaps for a simple read-only list tool.

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

Conciseness5/5

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

The description is a single sentence that front-loads the operation, scope, and return fields with no filler. Every word contributes value.

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

Completeness4/5

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

For a one-parameter tool with no output schema, the description is nearly complete: it states what is listed and the shape of each result. It could mention pagination or all transfer statuses, and it does not point to the incoming-transfer sibling, but the schema fully documents the only input.

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

Parameters3/5

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

The schema has 100% coverage and the parameter description already explains that licenseNumber may be omitted to default to METRC_LICENSE_NUMBER. The tool description adds no parameter-specific detail, so the baseline score of 3 is appropriate.

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 uses a specific verb ('List') and resource ('outgoing transfers for a facility') and names the returned fields: manifest number, recipient, and package count. The word 'outgoing' clearly distinguishes this from the sibling tool list_incoming_transfers.

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

Usage Guidelines3/5

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

The phrase 'for a facility' implies the tool should be used when outgoing transfer data for a facility is needed. However, it does not explicitly direct the agent to list_incoming_transfers for the opposite case, nor does it provide exclusion criteria. The usage guidance is implicit rather than explicit.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.2.0
    • First observedfinish_package
    • First observedget_lab_test_results
    • First observedget_package
    • First observedlist_active_packages
    • First observedlist_facilities
    • First observedlist_incoming_transfers
    • First observedlist_items
    • First observedlist_outgoing_transfers

TDQS

A4/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct resource and action: facilities, active packages, single package lookup, finishing packages, items, incoming/outgoing transfers, and lab results. Even the package-related tools are clearly separated by scope (list vs. get vs. lab results).

Naming Consistency5/5

Tool names consistently follow a verb_noun pattern using snake_case, with list_ for collection queries, get_ for single-record lookups, and finish_ for the one mutation. This makes the toolset predictable and easy for an agent to route.

Tool Count5/5

Eight tools is a well-scoped size for this domain. Each tool covers a meaningful part of the METRC workflow without unnecessary redundancy or bloat.

Completeness3/5

The read-side coverage is solid for facilities, packages, items, transfers, and lab results, and finish_package provides one mutation. However, common lifecycle operations such as creating or adjusting packages, receiving incoming transfers, and creating outgoing transfers are missing, leaving agents able to observe but not fully complete many compliance workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    MCP server for running infrastructure health checks with TIBET provenance. It enables users to define, execute, and audit process health checks with dependency chaining and drift tracking.
    6
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A lightweight, local inventory-intelligence MCP server that enables querying structured inventory schemas with read-only, zero-config tools for stock levels, velocity metrics, and purchase orders.
    7
    MIT
  • F
    license
    C
    quality
    A
    maintenance
    A production-ready MCP server for inventory and interaction with Alterios/LIMS instances, enabling project listing, readonly data queries via REST and script-services, and controlled write operations.
    100
    -