Skip to main content
Glama
ConsentirDev

BuyICT MCP Server

by ConsentirDev

BuyICT MCP Server

A Model Context Protocol (MCP) server that provides Claude with access to Australian Government ICT procurement opportunities from BuyICT.

Features

  • šŸ” Search procurement opportunities across multiple marketplaces

  • šŸ“‹ Get detailed information about specific opportunities

  • šŸŖ List available marketplaces (PCS, SMP, CMP, LH, TMP, DC, HMP)

  • šŸ” Supports authenticated access to BuyICT ServiceNow instance

Related MCP server: gets-nz

Installation

  1. Clone this repository or navigate to the project directory:

cd buyict_mcp
  1. Install dependencies:

npm install
  1. Build the TypeScript code:

npm run build

Configuration

1. Environment Variables

Copy the example environment file and fill in your credentials:

cp .env.example .env

2. Obtaining Session Credentials

To access BuyICT data, you need to provide session credentials from your browser:

  1. Open https://www.buyict.gov.au in your browser

  2. Log in (if required for the opportunities you want to access)

  3. Open Developer Tools (F12)

  4. Go to the Network tab

  5. Navigate to the Opportunities page or refresh it

  6. Look for a request to /api/now/sp/page?id=opportunities

  7. Click on it and go to the Headers section

  8. Find and copy the following values to your .env file:

From the Cookie header:

  • JSESSIONID → BUYICT_SESSION_ID

  • glide_user_route → BUYICT_GLIDE_USER_ROUTE

  • glide_node_id_for_js → BUYICT_GLIDE_NODE_ID

  • VALK_SESSION_ID → BUYICT_VALK_SESSION_ID

From request headers:

  • X-UserToken → BUYICT_USER_TOKEN

  • UX-Token → BUYICT_UX_TOKEN

Note: These tokens expire after some time. If you get authentication errors, you'll need to refresh them by repeating this process.

Usage with Claude Desktop

  1. Add the server to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "buyict": {
      "command": "node",
      "args": ["/absolute/path/to/buyict_mcp/dist/index.js"],
      "env": {
        "BUYICT_SESSION_ID": "your_session_id_here",
        "BUYICT_USER_TOKEN": "your_user_token_here",
        "BUYICT_UX_TOKEN": "your_ux_token_here"
      }
    }
  }
}

Or, to load from your .env file, use a wrapper script.

  1. Restart Claude Desktop

  2. The server will now be available with the following tools:

Available Tools

search_opportunities

Search for procurement opportunities with optional filters.

Parameters:

  • keyword (string, optional): Search term to filter opportunities

  • marketplace (string, optional): Filter by marketplace code (PCS, SMP, CMP, LH, TMP, DC, HMP)

  • page_size (number, optional): Results per page (default: 15, max: 100)

  • page (number, optional): Page number (default: 1)

Example:

Search for cloud computing opportunities in the Cloud Marketplace

get_opportunity_details

Get detailed information about a specific opportunity.

Parameters:

  • opportunity_id (string, required): The sys_id of the opportunity

  • table (string, required): Source table name (e.g., u_cmp_procurement)

Example:

Get details for opportunity ID abc123 from the u_cmp_procurement table

list_marketplaces

Get a list of all available marketplaces.

Example:

Show me all available BuyICT marketplaces

Marketplaces

The server supports the following BuyICT marketplaces:

Code

Name

Table

PCS

Panel & Catalogue Services

u_pcs_procurement

SMP

Software Marketplace

u_smp_procurement

CMP

Cloud Marketplace

u_cmp_procurement

LH

Labour Hire

u_lh_procurement

TMP

Telecommunications Marketplace

u_tmp_procurement

DC

Data Centre

u_dc_procurement

HMP

Hardware Marketplace

u_hmp_procurement

Development

Project Structure

buyict_mcp/
ā”œā”€ā”€ src/
│   ā”œā”€ā”€ index.ts                 # MCP server entry point
│   ā”œā”€ā”€ servicenow-client.ts     # ServiceNow API client
│   └── types.ts                 # TypeScript type definitions
ā”œā”€ā”€ config/
│   └── buyict-config.json       # Server configuration
ā”œā”€ā”€ dist/                        # Compiled JavaScript (generated)
ā”œā”€ā”€ package.json
ā”œā”€ā”€ tsconfig.json
ā”œā”€ā”€ .env.example
└── README.md

Building

npm run build

Development Mode (with watch)

npm run dev

Testing

Start the server manually to test:

npm start

Current Limitations

āš ļø Important: The current implementation has some limitations due to the ServiceNow Service Portal architecture:

  1. Data Fetching: The search_opportunities tool currently returns the initial page structure but may not include actual opportunity data. This is because:

    • ServiceNow widgets load data asynchronously via server-side scripts

    • The exact API endpoint for fetching opportunity data needs further investigation

    • May require authenticated access for full data access

  2. Authentication: Session tokens expire and need to be manually refreshed from your browser.

  3. Future Improvements Needed:

    • Discover the correct API endpoint for fetching opportunity listings

    • Implement automatic session refresh

    • Add caching to reduce API calls

    • Support more advanced filtering options

API Documentation

See these files for more details:

  • API_FINDINGS.md - Detailed API analysis and findings

  • AUTHENTICATION_ANALYSIS.md - Authentication mechanisms and requirements

  • MCP_SERVER_DESIGN.md - Architecture and design decisions

Troubleshooting

"User Not Authenticated" Error

This means your session tokens have expired. Follow the Configuration steps to get new tokens from your browser.

No Opportunities Returned

The search endpoint may require further implementation. Check the server logs for details. You may need to access opportunities directly via the website or investigate additional API endpoints.

Connection Issues

Ensure:

  • You have internet connectivity

  • BuyICT website is accessible

  • Your tokens are valid and not expired

Contributing

This is a work in progress. Contributions are welcome, especially:

  • Discovering the correct API endpoints for opportunity data

  • Implementing automatic authentication

  • Adding more filtering and search capabilities

  • Improving error handling

License

MIT

Disclaimer

This is an unofficial tool and is not affiliated with or endorsed by the Australian Government Digital Transformation Agency or BuyICT. Use responsibly and in accordance with BuyICT's terms of service.

Available Tools

3 tools
get_opportunity_detailsC

Get detailed information about a specific opportunity

ParametersJSON Schema
NameRequiredDescriptionDefault
opportunity_idYesThe sys_id of the opportunity
tableYesThe source table name (e.g., u_pcs_procurement, u_smp_procurement)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states this is a read operation ('Get'), implying it's non-destructive, but doesn't cover other aspects like authentication requirements, rate limits, error handling, or the format of the returned details. This leaves significant gaps for a tool with two required parameters.

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 that directly states the tool's purpose without unnecessary words. It's appropriately sized and front-loaded, making it easy to understand at a glance, which is ideal for conciseness.

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

Completeness2/5

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

Given the tool has no annotations and no output schema, the description is incomplete. It doesn't explain what 'detailed information' includes, the response format, or any behavioral traits like safety or performance. For a tool that retrieves data with specific parameters, more context is needed to guide effective usage.

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 description coverage is 100%, with clear descriptions for both parameters in the input schema. The description doesn't add any meaning beyond what the schema provides, such as explaining the relationship between 'opportunity_id' and 'table' or providing examples. This meets the baseline for high schema coverage.

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

Purpose4/5

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

The description clearly states the verb ('Get') and resource ('detailed information about a specific opportunity'), making the purpose unambiguous. However, it doesn't differentiate this tool from its sibling 'search_opportunities' which might also retrieve opportunity details, missing the specificity needed for a perfect score.

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?

The description provides no guidance on when to use this tool versus alternatives like 'search_opportunities' or 'list_marketplaces'. It lacks context about prerequisites, such as needing a specific opportunity ID, and doesn't mention any exclusions or recommended scenarios for usage.

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

list_marketplacesB

Get list of available marketplaces/procurement types

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states a read operation ('Get list') but doesn't mention any behavioral traits such as authentication needs, rate limits, response format, or potential side effects. This is inadequate for a tool with zero annotation coverage.

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 a single, efficient sentence that directly states the tool's purpose without unnecessary words. It could be slightly more structured by front-loading key details, but it's appropriately concise for a simple tool.

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

Completeness3/5

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

Given the tool's low complexity (0 parameters, no output schema, no annotations), the description is minimally adequate but lacks completeness. It doesn't explain the return values or behavioral context, which is a gap since there's no output schema to compensate.

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 0 parameters with 100% schema description coverage, so the schema fully documents the lack of inputs. The description doesn't add parameter details, but with no parameters, this is acceptable, and the baseline score is 4 as per the rules for 0-param tools.

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

Purpose4/5

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

The description clearly states the verb ('Get') and resource ('list of available marketplaces/procurement types'), making the purpose understandable. However, it doesn't explicitly differentiate from sibling tools like 'search_opportunities' or 'get_opportunity_details', which prevents a perfect score.

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?

The description provides no guidance on when to use this tool versus alternatives like 'search_opportunities' or 'get_opportunity_details'. It lacks context about prerequisites, timing, or exclusions, leaving the agent without usage direction.

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

search_opportunitiesC

Search for procurement opportunities on BuyICT with optional filters

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordNoSearch term to filter opportunities
marketplaceNoFilter by marketplace code (e.g., PCS, SMP, CMP, LH, TMP, DC, HMP)
page_sizeNoNumber of results per page (default: 15)
pageNoPage number (default: 1)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool searches for opportunities but doesn't describe key behaviors such as pagination handling (implied by 'page' and 'page_size' parameters), rate limits, authentication needs, or what the search results look like. This leaves significant gaps for a tool with 4 parameters and no output schema.

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 that directly states the tool's purpose without any unnecessary words. It's appropriately sized and front-loaded, 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.

Completeness2/5

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

Given the complexity of a search tool with 4 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain the return format, error handling, or how results are structured, which are critical for an agent to use the tool effectively. The high schema coverage helps, but the description doesn't compensate for the lack of behavioral and output context.

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%, so the schema already documents all parameters thoroughly. The description adds minimal value by mentioning 'optional filters', which aligns with the schema but doesn't provide additional semantic context or usage examples beyond what's in the parameter descriptions.

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

Purpose4/5

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

The description clearly states the action ('Search for procurement opportunities') and the target resource ('on BuyICT'), which provides a specific verb+resource combination. However, it doesn't explicitly differentiate from sibling tools like 'get_opportunity_details' or 'list_marketplaces' beyond the 'search' action, so it lacks sibling differentiation for a perfect score.

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?

The description mentions 'optional filters' which implies some context for usage, but it doesn't provide explicit guidance on when to use this tool versus alternatives like 'get_opportunity_details' or 'list_marketplaces'. No exclusions or specific scenarios are outlined, leaving the agent with minimal direction.

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. 3 tool updates
    • First observedget_opportunity_details
    • First observedlist_marketplaces
    • First observedsearch_opportunities

TDQS

B3.2/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: get_opportunity_details retrieves details for a specific opportunity, list_marketplaces provides available procurement types, and search_opportunities finds opportunities with filters. There is no overlap in functionality, making tool selection straightforward for an agent.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case: get_opportunity_details, list_marketplaces, and search_opportunities. The verbs (get, list, search) are appropriate and uniformly applied, creating a predictable naming convention.

Tool Count3/5

With only 3 tools, the set feels thin for a procurement domain that might require more operations like creating or updating opportunities. While the tools cover basic retrieval and listing, the count is borderline minimal for the apparent scope of a procurement server.

Completeness2/5

The tool surface is significantly incomplete for a procurement domain. It lacks essential CRUD operations such as create_opportunity, update_opportunity, or delete_opportunity, and does not include tools for managing bids or submissions. This will likely cause agent failures in full procurement workflows.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides access to New Zealand Government Electronic Tenders Service (GETS) without API keys, enabling querying and searching for government tenders and contracts.
    98 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Access Canada government procurement opportunities from CanadaBuys open data, enabling tender searches and procurement monitoring without an API key.
    154 npm
    1
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables searching and filtering federal contract opportunities by keyword, agency, set-aside, NAICS, and more from any MCP client. Analyzes solicitations for small-business fit and risk, and provides reference lookups for NAICS codes, set-asides, and federal thresholds.
    9
    MIT