Skip to main content
Glama

get_defect_link

Retrieve a direct link to a specific defect in Feishu by providing its ID, enabling quick access to issue details for development teams.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
IDYes

Implementation Reference

  • The handler function that executes the 'get_defect_link' tool logic. It receives the ID, queries the feishuService for the corresponding defect record link (token), and returns it formatted as JSON text in the MCP response structure.
    async ({ ID }) => {
      const token = await feishuService.getRecord('ID', ID);
      return {
        content: [{ 
          type: "text", 
          text: JSON.stringify({ token }, null, 2) 
        }]
      };
    }
  • Input schema for the 'get_defect_link' tool using Zod, validating the 'ID' parameter as a string.
    {
      ID: z.string(),
    },
  • Registration of the 'get_defect_link' tool on the McpServer instance, specifying name, input schema, and handler function.
    this.server.tool(
      "get_defect_link",
      {
        ID: z.string(),
      },
      async ({ ID }) => {
        const token = await feishuService.getRecord('ID', ID);
        return {
          content: [{ 
            type: "text", 
            text: JSON.stringify({ token }, null, 2) 
          }]
        };
      }
    );
  • Helper method that retrieves the shared link (defect link) for a record by filtering on a specified field name and value (used with field 'ID'). It fetches records, extracts record ID, and obtains the shared URL.
    async getRecord(fieldName: string, fieldValue: string): Promise<string | null> {
      const tenantAccessToken = await this.getTenantAccessToken();
      // 调用列出记录 API
      const { data } = await axios.get(
        `https://open.feishu.cn/open-apis/bitable/v1/apps/${this.APP_TOKEN}/tables/${this.TABLE_ID}/records`,
        {
          headers: {
            Authorization: `Bearer ${tenantAccessToken}`,
          },
          params: {
            filter: `CurrentValue.[${fieldName}] = "${fieldValue}"`, // 修改过滤条件的格式
          },
        }
      );
      if (data.code !== 0) {
        throw new Error(`Failed to get records: ${data.msg}`);
      }
      // 获取记录 ID
      const records = data.data.items;
      if (records.length === 0) {
        return null; // 没有找到匹配的记录
      }
      const recordId = records[0].record_id;
      // 构造记录链接
      let sharedLink = '查找不到此记录'
      if (recordId) {
        sharedLink = (await this.getSharedLink(recordId)) || sharedLink;
      }
      return sharedLink;
    }
  • Supporting helper that fetches the shared URL for a given record ID, called by getRecord to obtain the defect link.
    async getSharedLink(recordId: string): Promise<string | null> {
      const tenantAccessToken = await this.getTenantAccessToken();
      // 调用批量获取记录 API
      const { data } = await axios.post(
        `https://open.feishu.cn/open-apis/bitable/v1/apps/${this.APP_TOKEN}/tables/${this.TABLE_ID}/records/batch_get`,
        {
          record_ids: [recordId],
          with_shared_url: true, // 请求返回分享链接
        },
        {
          headers: {
            Authorization: `Bearer ${tenantAccessToken}`,
            "Content-Type": "application/json",
          },
        }
      );
      if (data.code !== 0) {
        throw new Error(`Failed to get shared link: ${data.msg}`);
      }
      const records = data.data.records;
      if (records.length === 0 || !records[0].shared_url) {
        return null; // 没有找到分享链接
      }
      return records[0].shared_url; // 返回分享链接
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NINGyv179/mcp-feishu'

If you have feedback or need assistance with the MCP directory API, please join our Discord server