SAP 商定 MCP
A 类 示范背景协议 连接克劳德的服务器 SAP 已商定:您的支出报告、支出、可用(未记账)支出、收据和旅行旅行——读作: 财务报告和审定财务报表 写,每写确认.
[尖叫声] AI开发的项目. 这个代码库是完全建成的,并且由 克劳德没有任何人对执行情况进行过审计。 在使用前审查所有代码和工具权限 .
[叹息] 非官方而无所支持. 此服务器不使用 Concur 所记录的伙伴 API 。 它将内部 GraphQL API 称为 Concur 网络应用程序本身, 由您自己签名的浏览器会话认证 。 它可能在不事先通知的情况下中断,自动使用可能会与SAP Concour或你的雇主的条款相冲突. 仅供自用,自酌取用.
尽你所能
问克洛德什么的:
- "我的协和会的哪些报告仍未提交,什么阻碍着它们?"
- "给我看看还没有上报的卡片交易"
- "创造一份叫做"奥斯汀离地"的报告,并将上星期的"Uber"和"酒店收费"移至其中
- "上载~/下载/餐饮.pdf 并附入餐饮费用"
- "我下次旅行是什么时候出发的 我住哪家酒店?"
所需资源
- 克劳德桌面, Claude 代码或任何 MCP 主机
- 节点.js 22.5年或以后
- 这个 上下文闪烁桥 浏览器扩展和一个已签名的 Concur 标签( )
https://<dc>.concursolutions.com/…(中文(简体) )
安装
Claude 代码插件
claude plugin marketplace add chrischall/concur-mcp
claude plugin install concur@chrischall
任意 MCP 主机( npx)
{
"mcpServers": {
"concur": {
"command": "npx",
"args": ["-y", "@chrischall/concur-mcp"],
"env": { "CONCUR_DC": "us2" }
}
}
}
克洛德桌面 (. mcpb)
安装 .mcpb 从 最新发布。安装器请求您的数据中心(默认) us2) (中文(简体) ).
如何认证
Concour的网络应用认证了它的API 调用 Http JWT 饼干,页面本身无法读取。 此服务器使用 获取代理 桥 仅读取 三场曲奇 您的签名标签: JWT,加上 Concour 遗留的会话饼干 OTSESSIONAABQRD 财务报告和审定财务报表 OTSESSIONAABQRN,然后从节点调用 Authorization: Bearer <jwt> (单位:千美元) Cookie 带有标签上的任何OTSESSION cookie的页眉——Concour的部分仍然由其遗留的服务(报告密钥,货币,可用收件,权限)来回答一个没有它们的错误. 饼干只被保存在记忆中,从不出现在出错或日志中;您家目录下所写的唯一东西就是桥的配对身份.
信物活了60分钟 服务器从您的标签中重新读取饼干( 全部一起) , 当符号在过期后两分钟内, 或者一次在 a 401 (每通电话重读一通并重试一通,绝无回环. 读取失败的方式 一个 Stale OTSESSION cookie 失败 获得相同的单重读和再试。 在打开标签时,Concor要保持饼干新鲜,所以 继续打开已签名的标签 当你使用工具. concur_healthcheck 报告哪一个来源提供了信使,它还剩了多少分钟,是否找到遗留的会话 cookie —— 从来不是一个 cookie 值.
从早先的建筑升级? 桥梁范围从
JWT单独到JWT+两个口味饼干。 双倍给付是透视的,所以一个已经发售的服务器必须是 重新核准一次:下个调用答案并带有新的一对代码(或范围更改后的通知)——在上下文Mint Bridge弹出中批准.
配对(一次)
- 安装 上下文闪烁桥 (Chrome:装入解开的放出拉链) 并在浏览器中签入 Concure.
- 叫克劳德跑
concur_healthcheck。第一个呼叫答案是 配对代码。 。 。 . - 批准上下文Mint桥的代码 这种信任贯穿于重启期间(它生活在
~/.fetchproxy/identity/) (中文(简体) ).
不止一个浏览器? 如果在几个浏览器中安装了ContextMint Bridge,则每个浏览器都会拨打同一个本地端口,其中任何一个都可以批准对接码. 在您的 Concure 会话的浏览器中批准 ——服务器在批准哪个扩展时标出,只有浏览器的分页才能提供cookie. 线条类 refusing an extension whose identity is not the one this MCP paired with {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}在石刻上是 其他项目 浏览器被转走,是无害的.
错误的浏览器, 还是改变浏览器 ? 撤销 concur-mcp 在上下文Mint Bridge弹出时,用 fpx trust clear concur-mcp (从) @fetchproxy/cli;或删除 ~/.fetchproxy/identity/concur-mcp.extension-trust.json),重新启动服务器,并从右侧浏览器再次对齐.
配置
| 新闻 var | 默认 | 目的 |
|---|---|---|
CONCUR_DC | us2 | 您的数据中心: 您登录标签主机的第一个标签( Nameus2 页:1 us2.concursolutions.com, (中文(简体) ), eu2(中文(简体) ). 必须匹配会话令牌的发件人, 或者每一次通话都出现错误, 显示要使用哪个值 . |
CONCUR_WS_PORT | 37149 | 接接接接接通的桥口 整个接取代理机队和背景明通桥共享 37149; 仅针对本地测试(或当一个主机注入每个注册端口时)进行超标. |
CONCUR_OUTPUT_DIR | ~/Downloads/concur-mcp | 何处 concur_get_receipt 保存已下载的收据( 绝不覆盖已有文件) . |
CONCUR_UPLOAD_ROOTS | ~/Downloads, (中文(简体) ), ~/Documents, (中文(简体) ), ~/Desktop,加上当它是您家目录中的文件夹时的 cwd(绝不) / 或家本身 – Claude 桌面在 /(中文(简体) ) | 唯一的文件夹 concur_upload_receipt 将从(一个分隔路径的列表)读取; ~ 页:1 主机服务器拒绝每次 path (使用时 concur_upload_slots 或者说 inline) (中文(简体) ). |
CONCUR_INLINE_RECEIPTS | 本地关闭, 当主机运行时 | true 制造 concur_get_receipt 返回结果中的图像,而不是写入一个文件(超过 10 MiB 被本地保存,或主机时的签名链接). |
MCP_USER_TZ | 服务器区域 | 您的 IANA 时区( 如 . America/New_York),用于“今天” concur_create_report 默认 reportDate. 设定为主机时——主机服务器运行于协调世界时,否则明天将会有一份晚报. |
CONCUR_DEBUG | 关 | 将桥上的角色和寿命周期记录为 stderr. |
MCP_CONFIRM_MODE | ask-user | 无法显示确认提示的客户端的写作——见下文. |
MCP_CONFIRM_ELICITATION | on | off 从不显示确认提示, 所以每个客户端都拿走 MCP_CONFIRM_MODE 路径(对于声明提示但从未给出提示的客户). |
确认写入
每个改变Concoun(或电子邮件某人)内容的工具都会被确认:
- 支持MCP诱导的客户端 显示真实的确认提示, 准确描述将发送什么 .
- 其他地方(Claude.ai、克洛德桌面) 第一通电话 没有 更改: 它返回一个精确的预览, 将会发送什么, 加上一个单一用途, 短寿命
confirmToken。如果请求中有任何变化,则拒绝.
MCP_CONFIRM_MODE 决定谁可以使用该标志:
| 数值 | 行为 |
|---|---|
ask-user (默认) | 模型必须显示预览,并在重用符号前在聊天中获得您的批准. |
auto | 模型在看到预览后可能使用符号本身. |
refuse | 拒绝给客户写作,没有立即确认。 未识别值作为 refuse。 。 。 . |
来自Concure的文本——卖主名,评论,出行细节,电子邮件——被作为不信任的数据处理:它永远不能授权写作.
工具
大部分读取工具 view: compact | full | raw (默认) compact: compact 放弃你很少需要的字段, full 全部留着, raw 是未预测的 Concor 响应.
会话和浏览
| 工具 | 它会做什么 |
|---|---|
concur_healthcheck | 哪个来源提供了代号, API是否接受, 往返时间, 过期分钟 |
concur_whoami | 您的用户身份、 数据中心、 符号分钟和启用的特性 |
concur_list_expense_types | 报告政策允许的开销( ID、 名称、 组) |
concur_list_payment_types | 支付类型,您可以支付费用(现金,公司卡,.) |
concur_list_currencies | 接受,可选择过滤 |
concur_search_locations | 按城市分列的支出地点(可选的国家/分区) |
报告和开支(阅读)
| 工具 | 它会做什么 |
|---|---|
concur_list_reports | 按状况分列的报告ALL, (中文(简体) ), ACTIVE, (中文(简体) ), UNSUBMITTED, (中文(简体) ), SENT_FOR_PAYMENT)和日期范围 |
concur_get_report | 一份报告:标题、每个支出条目及其例外blocking 防止提交) |
concur_get_report_timeline | 报告的时间表(评论和工作流程活动)和审计线索 |
concur_get_expense | 一项费用:按标签、项目、收货、评论、例外情况列出表格字段 |
concur_list_available_expenses | 尚未上报的卡片交易、电子收发和移动抓取 |
报告和开支(写——全部确认)
| 工具 | 它会做什么 | 可逆转? |
|---|---|---|
concur_create_report | 创建未提交的报告 | 对(concur_delete_report(中文(简体) ) |
concur_update_report | 更改标题字段; 只发送更改 | 对 |
concur_delete_report | 删除未提交的报告 和一切费用 | 没有 |
concur_add_report_comment | 增加一个评论批准人 | 没有 (无法删除评论) |
concur_submit_report | 向您的审批人发送报告 | 没有 达到一个人; concur_recall_report 在批准前可以收回 |
concur_recall_report | 回顾已提交的未经核准的报告 | 对 |
concur_create_expense | 在未提交的报表中添加一个费用; 任何可按标签编辑的表格字段( 海关、 车票号码、 从/ 到位置,...); 外币获得日期的汇率 | 对 |
concur_update_expense | 改变开支,包括这些表格字段和汇率;只发送变化 | 对 |
concur_delete_expenses | 从报告中删除支出(卡片交易返回现有支出) | 没有 |
concur_copy_expense | 复制费用 | 对 |
concur_move_available_expenses_to_report | 将可用费用移至报告 | 没有 (双方没有退后) |
concur_delete_available_expenses | 删除现有费用 | 没有 |
参与者
| 工具 | 它会做什么 | 可逆转? |
|---|---|---|
concur_search_attendees | 通过名称或电子邮件搜索参与者目录( 同事、 已保存的来宾) | 读取 |
concur_set_attendees | 替换 费用参与者列表(您先默认),平分金额——确认额 | 没有 (没有工具读取以前的列表, 或清除它) |
收款
| 工具 | 它会做什么 | 甘地吗? |
|---|---|---|
concur_list_available_receipts | 在您的收货店中接收不计入支出的图像 | 读取 |
concur_get_receipt | 下载一个收件图像(%% 25 MB): 至 CONCUR_OUTPUT_DIR 本地、内联网或10个以上的MiB的签名下载链接,有效期为1小时 | 无( 商定不变) |
concur_upload_slots | 已签名的上传 URL( 已准备好) curl)将接收文件发送给主机服务器 | 无( 只签名 URL) |
concur_upload_receipt | 从允许的本地文件夹上传 png / jpg / pdf (%% 25 MB) (path,仅本地安装),作为 base64 (inline),或从上传槽(blobKey(中文(简体) ) | 对 |
concur_attach_receipt | 将存储的图像附加到一个没有成本的成本中 | 对 |
concur_append_receipt | 添加已存储的图像作为支出收据的额外页面 | 对 |
concur_detach_receipt | 把图像从开支中取出 | 对 |
concur_add_missing_receipt_declaration | 缺少收据申报表(ffidavit),用于没有收据的开支 -- 您证明收据丢失;预览会显示您的策略声明文本。 没有工具删除一个( 附加一个收件替换它) | 对 |
concur_delete_receipt | 删除一个未附带的收件图像 —— 无法被撤销 | 对 |
旅费
| 工具 | 它会做什么 |
|---|---|
concur_list_trips | 您的旅行( 默认即将进行; 过去或全部), 可过滤 |
concur_get_trip | 搭乘飞机、旅馆、汽车和铁路的一程 |
concur_get_trip_history | 旅行历史:变更、批准、行程电子邮件 |
concur_send_itinerary | 发送旅行行程 发送真实的电子邮件,确认 |
逃生舱
| 工具 | 它会做什么 |
|---|---|
concur_list_operations | GraphQL 操作 Concur Web 应用程序使用的名称、 终点、 目的, 以及已经运行的专用工具 |
concur_graphql_query | 运行原始的只读查询( E)spend 或者说 cds 结束点);拒绝任何可以写入的内容 |
concur_graphql_mutation | 运行一个原始的突变, 在预览中以完整的文档确认; 拒绝包含提交在内的范围外的操作( 使用) concur_submit_report(中文(简体) ) |
范围外
这些在Concure中存在,但是是故意的 没有 已经建成。 未建成与被拒绝不同:生出逃生舱口仍能到达警卫不取名的下方.
被拒绝 concur_graphql_mutation (按操作名称和字段匹配网络应用程序的文本选择,所以重命名或化名无法通路): processApproval, (中文(简体) ), updateWorkItemStatus, (中文(简体) ), startSearch, (中文(简体) ), saveBookingSelections, (中文(简体) ), holdTrip, (中文(简体) ), confirmTrip, (中文(简体) ), commitChange, (中文(简体) ), tryCancelTripOrBooking,以及 SubmitExpenseReport (使用时 concur_submit_report) (中文(简体) ).
- 核准 ——批准或退回他人报告(
contextRole: MANAGER) (中文(简体) ). 未构建:approvalsportal.asp页 次GetApproversList财务报告和审定财务报表loadApprovalDetails读取,和UpdateTimelineWorkflow电话 拒绝: CDSprocessApproval,以及updateWorkItemStatus(单位:千美元)updateDelegatesDashboardWorkItemStatus) (中文(简体) ). 此服务器只操作您自己的数据 . - 卡片交易管理 ——卡片账户页面及其操作:
/Expense/Client/cardtransactions.asp, (中文(简体) ),GetCardAccounts, (中文(简体) ),GetCardTransaction, (中文(简体) ),MoveCCTransactionsToReport, (中文(简体) ),CreateCBSReportAndMoveCCTransactionsToReport, (中文(简体) ),RefreshYodleeTransactions. (已作为可用支出出现的信用证费用) 为: 已涵盖——列表,移到报告,删除。 ) - 预订或取消旅行 - 搜索、价格、帐簿、持有、确认或取消(
startSearch, (中文(简体) ),saveBookingSelections, (中文(简体) ),holdTrip, (中文(简体) ),confirmTrip, (中文(简体) ),commitChange, (中文(简体) ),tryCancelTripOrBooking) (中文(简体) ). 除了通过电子邮件发送行程之外,旅行只读.
升级
0.5.0 - (中文(简体) ) concur_get_receipt 内置输出. 返回的非图像收件内置( a PDF) 是一个嵌入式资源, 其 URI 现在 attachment:///receipt-<imageId>.<ext> (这是 concur-receipt:<imageId>) (中文(简体) ). JSON区块也有收益 via (单位:千美元)image, (中文(简体) ), resource, (中文(简体) ), link 或者说 disk),并在主机服务器上 downloadUrl + 键 expiresAt 用于签名链接。 和以前一样的电话 concur-receipt: URI 应改为: via 换句话说.
发展
npm install
npm run build # tsc → dist/, then esbuild → dist/bundle.js (the .mcpb entry)
npm test # typecheck + vitest
npm run test:coverage
API的表面是建立在 —— 主机、 认证器、 使用的每个操作, 以及经过验证的活件上 docs/CONCUR-API.md,有逐字记录文本 docs/api/。 。 。 .
许可证
麻省理工学院