Skip to main content
Glama

get_video_info

Retrieve detailed metadata for Bilibili videos using the video ID, including title, uploader, duration, and view statistics.

Instructions

Get detailed information about a Bilibili video

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bvidYes

Implementation Reference

  • src/mcp.ts:73-145 (registration)
    Dynamic registration of all tools, including 'get_video_info', by fetching tool descriptions from remote API and registering them with generic handler and schema.
    const getServer = async () => {
        console.log("getServer start.........")
        if(!isRegistered) {
            try {
                state.isLoading = true;
    
                const res = await fetch('https://mcp.xiaobenyang.com/getMcpDesc?mcpId=' + mcpID, {
                    method: 'GET',
                });
    
                if (!res.ok) {
                    throw new Error(`请求失败:${res.status}`);
                }
    
                const data = await res.json();
                const apiDescList = data.tools;
    
                for (const apiDesc of apiDescList) {
                    let inputSchema = JSON.parse(apiDesc.inputSchema);
                    const zodDict: Record<string, z.ZodTypeAny> = {};
    
                    Object.entries(inputSchema.properties).forEach(([name, propConfig]) => {
                        let zodType;
                        let pt = (propConfig as { type: string }).type;
                        switch (pt) {
                            case 'string':
                                zodType = z.string();
                                break;
                            case 'number':
                                zodType = z.number();
                                break;
                            case 'boolean':
                                zodType = z.boolean();
                                break;
                            case 'integer':
                                zodType = z.int32();
                                break;
                            case 'array':
                                zodType = z.array(z.any());
                                break;
                            case 'object':
                                zodType = z.object(z.any());
                                break;
                            default:
                                zodType = z.any();
                        }
    
                        if (inputSchema.required?.includes(name)) {
                            zodDict[name] = zodType;
                        } else {
                            zodDict[name] = zodType.optional();
                        }
                    });
    
    
                    addToolXiaoBenYangApi(
                        apiDesc.name,
                        apiDesc.description ? apiDesc.description : apiDesc.name,
                        zodDict);
                }
                isRegistered = true;
                state.isLoading = false;
                console.log("state.isLoading: " + state.isLoading)
                return server;
            } catch (error) {
                console.error("getServer 执行失败:", error);
                state.isLoading = false; // 异常时也需要重置加载状态
                throw error; // 抛出错误,让调用方捕获
            }
        } else {
            return server;
        }
    }
  • Core handler logic that proxies the tool call ('get_video_info' as toolName) to the remote API and formats the response.
    const calcXiaoBenYangApi = async function (fullArgs: Record<string, any>) {
        // 发起 POST 请求
        let response = await fetch('https://mcp.xiaobenyang.com/api', {
            method: 'POST',
            headers: {
                'XBY-APIKEY': apiKey,
                'func': fullArgs.toolName,
                'mcpid': mcpID
            },
            body: new URLSearchParams(fullArgs)
        });
        const apiResult = await response.text();
    
        return {
            content: [
                {
                    type: "text",
                    text: apiResult // 将字符串结果放入 content 中
                }
            ]
        } as { [x: string]: unknown; content: [{ type: "text"; text: string }] };
    };
  • Wrapper handler that prepares arguments with toolName ('get_video_info') and calls the core proxy function.
    const handleXiaoBenYangApi = async (args: Record<string, any>, toolName: string) => {
        // 校验aid是否存在
        if (toolName === undefined || toolName === null) {
            throw new Error("缺少必要参数 'aid'");
        }
        // 合并参数
        const fullArgs = {...args, toolName: toolName};
        // 调用API
        return calcXiaoBenYangApi(fullArgs);
    };
  • src/mcp.ts:50-65 (registration)
    Function used to register each tool (including 'get_video_info') with MCP server, providing generic handler.
    const addToolXiaoBenYangApi = function (
        name: string,
        desc: string,
        params: Record<string, ZodType>
    ) {
        server.registerTool(
            name,
            {
                title: name,
                description: desc,
                inputSchema: params,
            }
            ,
            async (args: Record<string, any>) => handleXiaoBenYangApi(args, name)
        )
    };
  • Dynamic construction of input schema (Zod) from remote tool description for each tool including 'get_video_info'.
    let inputSchema = JSON.parse(apiDesc.inputSchema);
    const zodDict: Record<string, z.ZodTypeAny> = {};
    
    Object.entries(inputSchema.properties).forEach(([name, propConfig]) => {
        let zodType;
        let pt = (propConfig as { type: string }).type;
        switch (pt) {
            case 'string':
                zodType = z.string();
                break;
            case 'number':
                zodType = z.number();
                break;
            case 'boolean':
                zodType = z.boolean();
                break;
            case 'integer':
                zodType = z.int32();
                break;
            case 'array':
                zodType = z.array(z.any());
                break;
            case 'object':
                zodType = z.object(z.any());
                break;
            default:
                zodType = z.any();
        }
    
        if (inputSchema.required?.includes(name)) {
            zodDict[name] = zodType;
        } else {
            zodDict[name] = zodType.optional();
        }
    });
Install Server

Other Tools

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/xiaobenyang-com/Bilibili-Api'

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