ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MCP Toolbox for Databases 的 postgres-list-stored-procedure 工具:存储过程元数据清单查询实战指南

MCP Toolbox for Databases 的 postgres-list-stored-procedure 工具:存储过程元数据清单查询实战指南 MCP Toolbox for Databases 的 postgres-list-stored-procedure 工具存储过程元数据清单查询实战指南【免费下载链接】mcp-toolboxMCP Toolbox for Databases is an open source MCP server for databases.项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox本篇技术指南围绕 MCP Toolbox for Databases本仓库中的postgres-list-stored-procedure工具展开完整讲解其工作原理、底层 SQL 实现、参数语义、配置方法与返回结构并给出可直接运行的请求示例。读完本文你将掌握如何通过 MCP 接口批量获取 PostgreSQL 存储过程的定义、属主、语言与注释信息并将其用于代码审计、文档生成、权限核查、迁移规划与安全评估等真实场景。工具概览一次查询返回完整存储过程元数据postgres-list-stored-procedure是一个只读工具用于检索 PostgreSQL 数据库中所有存储过程stored procedure的元数据。它直接查询 PostgreSQL 系统目录表pg_proc、pg_namespace、pg_roles与pg_language通过四表 JOIN 组装出包含如下信息的 JSON 数组存储过程所属的 schema模式存储过程名称拥有该存储过程的角色owner编写该存储过程的语言如plpgsql、sql、c完整的、可直接执行的CREATE PROCEDURE定义语句通过COMMENT命令设置的描述信息可能为null。结果默认按 schema 名称与过程名称排序默认最多返回 20 条记录。典型使用场景原文档明确了该工具的六大核心用途均围绕批量获取存储过程元数据这一能力展开代码审查与审计导出过程定义用于版本管理或合规审计文档生成自动提取过程元数据与描述信息生成数据库文档权限审计识别被特定用户拥有、或位于特定 schema 中的过程迁移规划在数据库迁移前一次性取回所有过程定义依赖分析通过阅读定义了解过程间的调用链与依赖关系安全评估审计哪些角色拥有并可修改存储过程。底层实现基于系统目录的 JOIN 查询在仓库源码 internal/tools/postgres/postgresliststoredprocedure/postgresliststoredprocedure.go 中工具的核心是一条固化在代码里的参数化 SQL其结构如下已按源码整理SELECT n.nspname AS schema_name, p.proname AS name, r.rolname AS owner, l.lanname AS language, pg_catalog.pg_get_functiondef(p.oid) AS definition, pg_catalog.obj_description(p.oid, pg_proc) AS description FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid p.pronamespace JOIN pg_catalog.pg_roles r ON r.oid p.proowner JOIN pg_catalog.pg_language l ON l.oid p.prolang WHERE p.prokind p AND ($1::text IS NULL OR r.rolname LIKE % || $1::text || %) AND ($2::text IS NULL OR n.nspname LIKE % || $2::text || %) ORDER BY n.nspname, p.proname LIMIT COALESCE($3::int, 20);对该 SQL 的逐段解读p.prokind p是关键过滤条件PostgreSQL 的pg_proc.prokind字段区分过程p、函数f、聚合函数a与窗口函数w。该条件保证了工具只返回存储过程而将普通函数等其他可调用对象全部排除pg_get_functiondef(p.oid)PostgreSQL 内建函数根据 oid 重建完整的、可直接运行的CREATE OR REPLACE PROCEDURE ...定义文本这正是definition字段的来源obj_description(p.oid, pg_proc)读取pg_description目录表中该对象的注释即COMMENT ON PROCEDURE ... IS ...写入的描述未设置注释时返回null三个占位参数$1、$2、$3分别对应role_name、schema_name与limit。前两者为NULL时过滤条件自动失效limit通过COALESCE($3::int, 20)在未传值时回退到默认值 20ORDER BY n.nspname, p.proname保证输出顺序稳定便于对比与分页。从源码可以看出参数全部通过pgx连接池以参数化查询方式传入见 postgresliststoredprocedure.go不存在 SQL 注入拼接问题这是一个安全设计细节。工具注册与调用链路该工具遵循 MCP Toolbox 统一的注册—配置—调用模式包内init()调用tools.Register(postgres-list-stored-procedure, newConfig)完成类型注册postgresliststoredprocedure.goRegister的通用机制定义在 internal/tools/tools.go配置解析阶段声明三个入参role_name、schema_name、limitpostgresliststoredprocedure.go其中limit带默认值 20Invoke方法从请求参数中取出标准参数通过source.PostgresPool().Query(...)执行上述 SQL并逐行把结果字段名与取值组装为map[string]any返回postgresliststoredprocedure.go。兼容数据源一次实现三种数据库引擎复用原文档通过compatible-sources声明了该工具的兼容来源。结合源码 postgresliststoredprocedure.go工具定义了一个最小接口compatibleSourcetype compatibleSource interface { PostgresPool() *pgxpool.Pool }只要数据源实现了PostgresPool()方法即可直接复用本工具。源码中通过编译期断言确认了以下三类数据源均满足该接口PostgreSQL原生数据源见 internal/sources/postgresAlloyDB for PostgreSQL见 internal/sources/alloydbpgCloud SQL for PostgreSQL见 internal/sources/cloudsqlpg。因此同一份工具配置可以无缝切换到本地 PostgreSQL、AlloyDB 或 Cloud SQL for PostgreSQL 连接。这一点与官方文档中 AlloyDB 与 Cloud SQL for PostgreSQL 的兼容说明一致。若传入的数据源不满足该接口Invoke会返回source used is not compatible with the tool错误postgresliststoredprocedure.go。参数说明工具的请求参数如下表与源码中parameters.Parameters声明一致parametertyperequireddefaultdescriptionrole_namestringfalsenull可选按存储过程的属主owner过滤支持部分匹配schema_namestringfalsenull可选按 schema 名称过滤支持部分匹配limitintegerfalse20可选最多返回的存储过程数量参数语义要点role_name与schema_name都使用LIKE % || $n || %做包含式部分匹配例如传app会同时命中app_user、app_admin等角色两个过滤参数均为可选缺省时对应NULL过滤条件自动失效即不过滤limit缺省为 20传入值通过COALESCE覆盖默认值当数据库中的过程数量很大时建议显式调高。配置方法在 MCP Toolbox 的 YAML 配置体系中该工具以kind: tool声明并归属到某个 source。文档给出的最小配置示例如下kind: tool name: list_stored_procedure type: postgres-list-stored-procedure source: postgres-source description: Retrieves stored procedure metadata including definitions and owners.配置字段说明name工具实例名称供 Agent 调用时引用type固定为postgres-list-stored-procedure是注册表中的资源类型标识source指向一个已配置且兼容的数据源PostgreSQL / AlloyDB / Cloud SQL for PostgreSQLdescription可选的工具描述缺省时源码会自动填入默认描述postgresliststoredprocedure.goauthRequired可选可声明该工具调用所需的 Google 认证服务列表见测试用例中的用法。此外仓库的预构建配置 internal/prebuiltconfigs/tools/postgres.yaml 已经内置了一个开箱即用的实例list_stored_procedure关联到postgresql-source并将其挂载进名为data的 toolsetpostgres.yaml。同样的工具实例也出现在 alloydb-postgres.yaml、cloud-sql-postgres.yaml 与 alloydb-omni.yaml 中进一步印证了其跨数据源的通用性。配置解析的验证仓库的单元测试 internal/tools/postgres/postgresliststoredprocedure/postgresliststoredprocedure_test.go 验证了 YAML 配置能被正确解析为Config结构体覆盖了带authRequired与不带authRequired两种形态并断言type、source、name、description等字段的解析结果与期望一致。同时集成测试辅助文件 tests/common.go 也注册了PostgresListStoredProcedureToolType postgres-list-stored-procedure说明该工具被纳入端到端测试体系。示例请求工具通过 MCP 的tools/call语义被调用请求体即参数的 JSON 对象。以下是文档给出的各类典型请求列出全部存储过程默认上限 20 条{}按属主过滤{ role_name: app_user }按 schema 过滤{ schema_name: public }同时按属主与 schema 过滤并调整上限{ role_name: postgres, schema_name: public, limit: 50 }按部分 schema 名匹配{ schema_name: audit }输出格式与示例响应工具返回一个 JSON 数组每个元素对应一个存储过程字段定义如下fieldtypedescriptionschema_namestring存储过程所属的 schema 名称namestring存储过程名称ownerstring拥有该存储过程的 PostgreSQL 角色/用户languagestring编写过程的语言如plpgsql、sql、cdefinitionstring完整 SQL 定义包含完整的CREATE PROCEDURE语句descriptionstring过程的可选描述/注释未设置注释时为null一个典型的响应示例如下[ { schema_name: public, name: process_payment, owner: postgres, language: plpgsql, definition: CREATE OR REPLACE PROCEDURE public.process_payment(p_order_id integer, p_amount numeric)\n LANGUAGE plpgsql\nAS $procedure$\nBEGIN\n UPDATE orders SET status paid, amount p_amount WHERE id p_order_id;\n INSERT INTO payment_log (order_id, amount, timestamp) VALUES (p_order_id, p_amount, now());\n COMMIT;\nEND\n$procedure$, description: Processes payment for an order and logs the transaction }, { schema_name: public, name: cleanup_old_records, owner: postgres, language: plpgsql, definition: CREATE OR REPLACE PROCEDURE public.cleanup_old_records(p_days_old integer)\n LANGUAGE plpgsql\nAS $procedure$\nDECLARE\n v_deleted integer;\nBEGIN\n DELETE FROM audit_logs WHERE created_at now() - (p_days_old || days)::interval;\n GET DIAGNOSTICS v_deleted ROW_COUNT;\n RAISE NOTICE Deleted % records, v_deleted;\nEND\n$procedure$, description: Removes audit log records older than specified days }, { schema_name: audit, name: audit_table_changes, owner: app_user, language: plpgsql, definition: CREATE OR REPLACE PROCEDURE audit.audit_table_changes()\n LANGUAGE plpgsql\nAS $procedure$\nBEGIN\n INSERT INTO audit.change_log (table_name, operation, changed_at) VALUES (TG_TABLE_NAME, TG_OP, now());\nEND\n$procedure$, description: null } ]值得注意的是definition字段是pg_get_functiondef重建出的完整可执行语句可以直接用于重建过程或纳入迁移脚本而description来自COMMENT命令因此既可能是有意义的文本也可能如第三个示例那样为null。高级用法与注意事项性能考量过滤在数据库层完成使用的是LIKE包含式匹配形如% || 值 || %因此天然支持部分匹配但也意味着无法利用常规 B-tree 索引做前缀匹配加速在超大规模角色/schema 集合下建议配合limit使用过程的definition字段可能很长包含完整函数体当库中过程数量较多时务必通过limit控制返回体量避免响应过大结果按 schema 名与过程名排序输出顺序稳定便于与上一次结果做差异比对默认上限 20 条适合多数场景确有需要时按实际规模调大。使用注意只返回存储过程prokind p过滤确保普通函数prokind f等其他可调用对象不会混入结果如需函数清单请使用其他工具过滤为部分匹配role_name: app会同时匹配app_user、app_admin等所有包含app的名称按需精确过滤时请给出完整名称definition字段包含完整的、可直接运行的CREATE PROCEDURE语句description字段由 PostgreSQL 的COMMENT命令写入可能为null。小结postgres-list-stored-procedure以一条精心设计的系统目录 JOIN 查询为内核通过 MCP Toolbox 统一的注册—配置—调用机制将 PostgreSQL 存储过程的 schema、名称、属主、语言、完整定义与注释一次性暴露给 Agent。它天然兼容 PostgreSQL、AlloyDB for PostgreSQL 与 Cloud SQL for PostgreSQL 三类数据源参数化查询、只读注解与排序/分页设计使其适合作为审计、文档化、迁移与安全评估流程中的稳定数据来源。结合 源码实现 与 预构建配置 可以进一步了解其细节并将其快速接入你自己的工具箱配置。【免费下载链接】mcp-toolboxMCP Toolbox for Databases is an open source MCP server for databases.项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表