内容
# mcp-canadabuys
[](https://pypi.org/project/mcp-canadabuys/)
[](https://www.python.org/)
[](https://modelcontextprotocol.io/)
[](LICENSE)
MCP 服务器,为 AI 代理提供结构化的访问加拿大联邦采购数据的途径,来源于 [CanadaBuys](https://canadabuys.canada.ca/)。
## 功能描述
`mcp-canadabuys` 封装了 CanadaBuys 的开放数据 — 实时招标和历史合同奖励 — 并将其暴露给 AI 代理,作为一组描述良好的 MCP 工具。它将凌乱的双语 CSV 源规范化为干净的模式,评估即将到期的合同的 Buy Canadian 重投标潜力,并允许代理研究部门和现任供应商。所有与国防相关的采购在数据层永久排除。
## 快速开始 — Claude Code
```bash
claude mcp add mcp-canadabuys -- uvx mcp-canadabuys
```
## 快速开始 — Claude Desktop
将以下内容添加到您的 `claude_desktop_config.json` 中:
```json
{
"mcpServers": {
"canadabuys": {
"command": "uvx",
"args": ["mcp-canadabuys"]
}
}
}
```
## 快速开始 — 从源代码开始
```bash
git clone https://github.com/alaylik-png/mcp-canadabuys.git
cd mcp-canadabuys
uv sync --extra dev
uv run mcp-canadabuys
```
## 工具列表
| 工具 | 描述 | 关键参数 |
|---|---|---|
| `search_open_tenders` | 搜索当前开放的联邦招标,按截止日期排序(最紧急的优先)。 | `keywords`, `category`, `department`, `region`, `closing_within_days` |
| `get_tender` | 通过其 CanadaBuys 参考编号检索招标的完整详细信息。 | `source_ref` |
| `search_awards` | 搜索历史联邦合同奖励以查找现任供应商和竞争历史。 | `vendor_name`, `department`, `category`, `gsin_prefix`, `year` |
| `get_award` | 通过参考编号检索奖励公告的完整详细信息。 | `source_ref` |
| `get_expiring_contracts` | 查找在一定时间内到期的合同 — 重投标机会 — 并附有 Buy Canadian 评分。 | `days_ahead`, `category`, `department`, `foreign_incumbent_only` |
| `get_department_profile` | 部门的采购情报概况:支出、主要类别、重复供应商、到期日。 | `department_name` |
| `get_vendor_history` | 供应商的完整政府承包历史,按财政年度和部门划分。 | `vendor_name`, `include_expiring` |
每个工具结果都封装在 `_meta` 信封中,携带开放政府许可属性和缓存/新鲜度元数据。
## 资源和提示
**资源**
| URI | 内容 |
|---|---|
| `data://canadabuys/categories` | 四个采购类别代码(CNST,GD,SRV,SRVTGD)及其标签和示例。 |
| `data://canadabuys/departments` | 具有已知变体和缩写的规范联邦部门名称。 |
| `data://canadabuys/data-dictionary` | 从官方 CanadaBuys 数据字典中解析的关键字段定义。 |
**提示**
| 提示 | 功能描述 |
|---|---|
| `find_opportunities` | 有指导的工作流:为供应商出售的产品评估开放招标和即将到期的合同,附带进入壁垒和下一步行动。 |
| `research_incumbent` | 为现任供应商建立一份纯语言情报简报:业务范围、易受影响的合同、Buy Canadian 暴露度。 |
## 数据源和新鲜度
所有数据均由加拿大政府根据开放政府许可 — 加拿大通过 [CanadaBuys 开放数据](https://canadabuys.canada.ca/en/open-data) 发布。
| 数据集 | 更新频率 |
|---|---|
| 新招标 | 每 2 小时 |
| 开放招标 | 每日 |
| 奖励公告 | 每月(从 ABE 系统转移) |
奖励数据不详尽 — 并非每个合同都有已发布的奖励公告。估计的到期日期根据奖励日期和合同期限得出,且为近似值。
## 防御排除政策
与国防相关的采购 **永远不会** 出现在任何结果中。这是产品的一项永久决定,在任何工具返回数据之前,在数据层应用 — 模型永远不会看到被排除的记录。当以下条件成立时,会排除记录:
- 买方/部门与国防部、国防部、DND、MND、通信安全机构(CSE)、国防研究(DRDC)或国防建设(不区分大小写)相匹配。
- GSIN 代码属于军事联邦供应分类组 10–14。
- CanadaBuys 参考编号以 `W` 开头(为国防部保留的 PWGSC W 文件前缀)。
- 招标标题包含军事关键词(例如弹药、军火、弹药、装甲、战舰、潜艇、导弹、鱼雷、雷达系统)。
排除规则由配置驱动,可以扩展,但绝不能删除。
## 数据许可
> 包含根据开放政府许可 — 加拿大授权的信息。
> <https://open.canada.ca/en/open-government-licence-canada>
## 贡献
欢迎贡献。要添加新的数据模块:
1. 分叉仓库。
2. 创建 `src/mcp_canadabuys/modules/<name>/`,遵循必填的 7 文件模式(`__init__.py`、`constants.py`、`schemas.py`、`client.py`、`tools.py`、`prompts.py`、`resources.py`)。模块自动发现。
3. 在返回数据之前,在 `client.py` 中应用防御排除,并将每个工具结果封装在 `_meta` 信封中。
4. 在 `tests/` 下添加单元测试(模拟 HTTP,无实时调用),并保持覆盖率超过 80%。运行 `uv run pytest`。
5. 打开拉取请求。
参见 [CLAUDE.md](CLAUDE.md) 以获取完整约定。
## 许可
[MIT](LICENSE)