Skip to main content
Glama

mcp_sp_structure

Analyze SQL Server stored procedure structure to view parameters, dependencies, and source code for database development and maintenance.

Instructions

Analyze SQL Server stored procedure structure including parameters, dependencies, and source code

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sp_nameYesFully qualified stored procedure name (schema.name), e.g. "eco.usp_Insert_EconomicMovement_v2"

Implementation Reference

  • Core handler function implementing mcp_sp_structure tool. Analyzes stored procedure by fetching info, parameters, dependencies, and source code using parallel SQL queries.
    export const mcp_sp_structure = async (args: { sp_name: string }): Promise<ToolResult<{
      info: any;
      parameters: any[];
      dependencies: any[];
      definition: any
    }>> => {
      const { sp_name } = args;
      console.log('Executing mcp_sp_structure with:', { sp_name });
    
      const qualified_name = normalizeSqlObjectName(sp_name);
    
      try {
        const pool = getPool();
    
        // Enhanced query for basic information - matching Python implementation
        const infoQuery = `
          SELECT 
              OBJECT_SCHEMA_NAME(o.object_id) as schema_name,
              o.name as procedure_name,
              o.create_date,
              o.modify_date,
              m.definition as source_code,
              o.type_desc,
              CAST(ep.value AS NVARCHAR(MAX)) AS description
          FROM sys.objects o
          INNER JOIN sys.sql_modules m ON o.object_id = m.object_id
          LEFT JOIN sys.extended_properties ep ON o.object_id = ep.major_id AND ep.minor_id = 0 AND ep.name = 'MS_Description'
          WHERE o.type = 'P'
          AND o.object_id = OBJECT_ID(@qualified_name);
        `;
    
        // Enhanced query for parameters - matching Python implementation
        const paramsQuery = `
          SELECT 
              p.name as parameter_name,
              t.name as data_type,
              p.max_length,
              p.precision,
              p.scale,
              p.is_output,
              p.has_default_value,
              p.default_value,
              p.parameter_id
          FROM sys.parameters p
          INNER JOIN sys.types t ON p.system_type_id = t.system_type_id AND t.user_type_id = t.system_type_id
          WHERE p.object_id = OBJECT_ID(@qualified_name)
          ORDER BY p.parameter_id;
        `;
    
        // Enhanced query for dependencies - matching Python implementation
        const dependenciesQuery = `
          SELECT DISTINCT
              dep.referenced_schema_name,
              dep.referenced_entity_name,
              o.type_desc as referenced_type,
              dep.referenced_database_name,
              dep.referenced_server_name
          FROM sys.dm_sql_referenced_entities(@qualified_name, 'OBJECT') dep
          LEFT JOIN sys.objects o ON OBJECT_ID(ISNULL(dep.referenced_database_name + '.', '') + 
                                              ISNULL(dep.referenced_schema_name + '.', '') + 
                                              dep.referenced_entity_name) = o.object_id
          WHERE dep.referenced_id IS NOT NULL
          ORDER BY dep.referenced_schema_name, dep.referenced_entity_name;
        `;
    
        // Execute all queries in parallel
        const [infoResult, paramsResult, dependenciesResult] = await Promise.all([
          pool.request().input('qualified_name', qualified_name).query(infoQuery),
          pool.request().input('qualified_name', qualified_name).query(paramsQuery),
          pool.request().input('qualified_name', qualified_name).query(dependenciesQuery)
        ]);
    
        return {
          success: true,
          data: {
            info: infoResult.recordset[0] || null,
            parameters: paramsResult.recordset,
            dependencies: dependenciesResult.recordset,
            definition: infoResult.recordset[0]?.source_code || null
          }
        };
      } catch (error: any) {
        console.error(`Error in mcp_sp_structure for SP ${sp_name}: ${error.message}`);
        return { success: false, error: error.message };
      }
    };
  • src/tools.ts:19-32 (registration)
    Tool registration entry in MCP_MSQL_TOOLS array, defining name, description, and JSON input schema for MCP protocol.
    {
      name: "mcp_sp_structure",
      description: "Analyze SQL Server stored procedure structure including parameters, dependencies, and source code",
      inputSchema: {
        type: "object",
        properties: {
          sp_name: {
            type: "string",
            description: "Fully qualified stored procedure name (schema.name), e.g. \"eco.usp_Insert_EconomicMovement_v2\""
          }
        },
        required: ["sp_name"]
      }
    },
  • TypeScript type definitions for input (args: { sp_name: string }) and output (ToolResult<{info, parameters, dependencies, definition}>) providing schema validation.
    export const mcp_sp_structure = async (args: { sp_name: string }): Promise<ToolResult<{
      info: any;
      parameters: any[];
      dependencies: any[];
      definition: any
    }>> => {
  • Re-export of the mcp_sp_structure handler from storedProcedureAnalysis module for barrel export.
    export {
      mcp_sp_structure,       // Complete stored procedure analysis
      mcp_get_sp_all_info_simple // Para compatibilidad con server.ts
    } from './storedProcedureAnalysis.js';
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but lacks behavioral details. It doesn't disclose whether this is a read-only operation, if it requires specific permissions, potential performance impact, or what the output format looks like (e.g., structured data vs raw text). The description only states what is analyzed, not how it behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core purpose. Every word contributes meaning without redundancy. However, it could be slightly more structured by separating analysis aspects with commas or bullets for better readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations and no output schema, the description is incomplete. It doesn't explain what the analysis returns (e.g., a report, structured data, or raw code), nor does it cover behavioral aspects like error conditions or limitations. Given the complexity of analyzing stored procedures, more context is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with the single parameter 'sp_name' fully documented in the schema. The description adds no additional parameter semantics beyond implying it analyzes the given stored procedure. This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'analyze' and the resource 'SQL Server stored procedure structure', specifying what aspects are analyzed (parameters, dependencies, source code). It distinguishes from obvious siblings like mcp_execute_procedure (which runs procedures) and mcp_get_dependencies (which focuses only on dependencies), though not all sibling distinctions are explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to choose this over mcp_get_dependencies for dependency analysis, mcp_table_analysis for broader analysis, or mcp_search_comprehensive for discovery. No prerequisites or exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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/hendrickcastro/MCPQL'

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