BuyICT MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@BuyICT MCP Serversearch for cloud computing opportunities in the Cloud Marketplace"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Clone this repository or navigate to the project directory:
cd buyict_mcpInstall dependencies:
npm installBuild the TypeScript code:
npm run buildConfiguration
1. Environment Variables
Copy the example environment file and fill in your credentials:
cp .env.example .env2. Obtaining Session Credentials
To access BuyICT data, you need to provide session credentials from your browser:
Open https://www.buyict.gov.au in your browser
Log in (if required for the opportunities you want to access)
Open Developer Tools (F12)
Go to the Network tab
Navigate to the Opportunities page or refresh it
Look for a request to
/api/now/sp/page?id=opportunitiesClick on it and go to the Headers section
Find and copy the following values to your
.envfile:
From the Cookie header:
JSESSIONIDāBUYICT_SESSION_IDglide_user_routeāBUYICT_GLIDE_USER_ROUTEglide_node_id_for_jsāBUYICT_GLIDE_NODE_IDVALK_SESSION_IDāBUYICT_VALK_SESSION_ID
From request headers:
X-UserTokenāBUYICT_USER_TOKENUX-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
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.
Restart Claude Desktop
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 opportunitiesmarketplace(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 Marketplaceget_opportunity_details
Get detailed information about a specific opportunity.
Parameters:
opportunity_id(string, required): The sys_id of the opportunitytable(string, required): Source table name (e.g., u_cmp_procurement)
Example:
Get details for opportunity ID abc123 from the u_cmp_procurement tablelist_marketplaces
Get a list of all available marketplaces.
Example:
Show me all available BuyICT marketplacesMarketplaces
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.mdBuilding
npm run buildDevelopment Mode (with watch)
npm run devTesting
Start the server manually to test:
npm startCurrent Limitations
ā ļø Important: The current implementation has some limitations due to the ServiceNow Service Portal architecture:
Data Fetching: The
search_opportunitiestool 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
Authentication: Session tokens expire and need to be manually refreshed from your browser.
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 findingsAUTHENTICATION_ANALYSIS.md- Authentication mechanisms and requirementsMCP_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 toolsget_opportunity_detailsC
Get detailed information about a specific opportunity
| Name | Required | Description | Default |
|---|---|---|---|
| opportunity_id | Yes | The sys_id of the opportunity | |
| table | Yes | The source table name (e.g., u_pcs_procurement, u_smp_procurement) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | No | Search term to filter opportunities | |
| marketplace | No | Filter by marketplace code (e.g., PCS, SMP, CMP, LH, TMP, DC, HMP) | |
| page_size | No | Number of results per page (default: 15) | |
| page | No | Page number (default: 1) |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
- First observed
get_opportunity_details - First observed
list_marketplaces - First observed
search_opportunities
TDQS
Scored across 3 tools
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.
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.
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.
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
Related MCP Connectors
Search AU/NZ government tenders and rank a shortlist against company capabilities.
MCP access to the U.S. federal procurement graph: contracts, opportunities, entities, and more.
Government contract search and federal procurement data: SAM.gov opportunities + USASpending awards.
- GovTribeOAuthcom.govtribe
Search U.S. federal, state, and local government procurement data and intelligence.
Related MCP Servers
- AlicenseAqualityFmaintenanceMatch your tech product or consulting service to thousands of live government tenders, RFPs, grants, and frameworks from 25+ official sources worldwide.430 npm6MIT
- AlicenseNot gradedqualityBmaintenanceProvides access to New Zealand Government Electronic Tenders Service (GETS) without API keys, enabling querying and searching for government tenders and contracts.98 npmMIT
- AlicenseNot gradedqualityBmaintenanceAccess Canada government procurement opportunities from CanadaBuys open data, enabling tender searches and procurement monitoring without an API key.154 npm1MIT
- AlicenseBqualityAmaintenanceEnables 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.9MIT