{"serverInfo":{"name":"ServiceContext","version":"0.1","description":"Context-aware semantic search and AI assistance platform","author":"Daniel Aagren Seehartrai Madsen","authorWebsite":"https://www.danielmadsen.dk","note":"Alpha version - semantic search across documentation, best practices, and expert knowledge. Planned beta release in Q1 2026."},"capabilities":{"tools":12,"prompts":10},"tools":[{"name":"search","description":"Search ServiceNow documentation using semantic similarity with advanced filtering.\n\nThis tool performs vector-based semantic search to find relevant documentation\nby matching the meaning of your query across multiple APIs.\n\n**CRITICAL DECISION RULE - Read this first**:\n\nYou MUST follow this rule:\n\nIF user asks a BROAD/CONCEPTUAL question WITHOUT mentioning an API:\n   - User: \"How do I create records in ServiceNow?\"\n   - User: \"What's the best way to query a table?\"\n   - USE THIS TOOL: scripting_search()\n\nIF user mentions a SPECIFIC API name:\n   - User: \"Show me GlideRecord examples\"\n   - User: \"What methods does GlideAjax have?\"\n   - DO NOT USE THIS TOOL\n   - INSTEAD use DISCOVERY TRACK (see module docstring):\n     1. scripting_list_methods(api=...) <- MANDATORY first\n     2. Then scripting_get_examples/scripting_get_returns/scripting_get_parameters()\n\n**When to use this tool**:\n- Broad questions without specific API: \"How do I handle ServiceNow errors?\"\n- Unknown API: \"What API handles email notifications?\"\n- Conceptual/exploratory queries: \"ServiceNow access control\"\n- Fuzzy matching across multiple APIs\n\n**When NOT to use** (MUST use Discovery Track instead):\n- User mentions specific API -> Use scripting_list_methods first\n- User asks about specific method -> Use scripting_list_methods first\n- User wants examples/parameters/returns -> Use scripting_list_methods first\n\n**How to construct effective queries**:\nThis tool uses semantic search (like Google), not exact keyword matching. Transform the user's\nnatural language question into keyword-focused search terms for best results:\n- User asks: \"How do I create a new record in a table?\"\n- Convert to: \"create record insert table\" (NOT \"GlideRecord\" - unknown which API)\n- User asks: \"What's the best practice for querying?\"\n- Convert to: \"query table records best practice\"\n\n**Query Construction Tips**:\n- BAD: \"How do I use GlideRecord to query incidents?\" (mentions API - use Discovery Track)\n- GOOD: \"query incidents filter active state\" (exploratory, no specific API)\n- BAD: \"What is the best way to insert records?\" (too vague)\n- GOOD: \"insert create new record table\" (keyword-focused)\n\n**Best practices**:\n- Use for EXPLORATORY searches (don't know the API yet)\n- Remove API names if exploring across multiple APIs\n- Remove filler words like \"How do I\", \"What is\", \"Tell me about\"\n- Keep queries concise (3-10 keywords typically works best)\n- If query mentions API name, switch to Discovery Track\n\n**Workflow**:\n1. User asks broad question WITHOUT API name\n2. Convert question to keywords\n3. Call scripting_search() with keyword query\n4. Optionally: Call scripting_get_document() for full document\n\nArgs:\n    query: Keyword-focused search query (e.g., \"GlideRecord insert method\", \"query parameters\", \"update record example\")\n           NOT a full question - transform questions into keywords for better semantic search results\n    api: Filter by API name (optional, e.g., \"GlideRecord\", \"GlideAjax\", \"gs\")\n         NOTE: This parameter is called 'api' for user-facing clarity, but internally maps to the 'object_name' database column.\n         The mapping is handled transparently by the SearchService and repository layers.\n    section: Filter by section type (optional):\n        - \"method_description\": Description of a method\n        - \"parameter\": Parameter documentation\n        - \"returns\": Return value documentation\n        - \"example\": Code examples\n        - \"object\": Overall object/API description\n    scope: Filter by scope (optional):\n        - \"Global\": Only APIs available in Global scope\n        - \"Scoped\": Only APIs available in Scoped applications\n        Note: Results may support multiple scopes; this filters for APIs that include the specified scope\n    release: Filter by ServiceNow release (optional, e.g., \"Zurich\", \"Vancouver\", \"Washington\")\n    limit: Maximum number of results (default: 5, max: 20)\n\nReturns:\n    List of SearchResult objects with:\n    - id: Document ID\n    - api: ServiceNow API name\n    - method_name: Method or function name\n    - section: Section type (method_description, parameter, returns, example, object)\n    - content: Documentation content\n    - metadata: JSONB metadata including:\n        - url: Link to official ServiceNow documentation\n        - scopes: Array of supported scopes ([\"Global\"], [\"Scoped\"], or [\"Global\", \"Scoped\"])\n        - release: ServiceNow release (e.g., \"Zurich\")\n        - description: Full description text\n    - similarity: Relevance score (0-1, higher is more relevant)\n\nExamples:\n    # Search for GlideRecord methods available in Global scope\n    scripting_search(\"query records\", api=\"GlideRecord\", scope=\"Global\")\n\n    # Find Zurich release documentation with examples\n    scripting_search(\"insert method\", section=\"example\", release=\"Zurich\")\n\n    # Broad search across all scopes and releases\n    scripting_search(\"How do I create a new table?\")\n\nRaises:\n    ToolError: If input validation fails or search fails","inputSchema":null},{"name":"get_document","description":"Retrieve a specific ServiceNow documentation entry by ID.\n\n**When to use**: After calling scripting_search(), you get documents with IDs\nand similarity scores. Use this tool to fetch the full content of a specific result.\n\n**Use case**: User asks \"Tell me more about that last result\" or you want complete\ndocumentation for a document returned from search.\n\n**Typical workflow**:\n1. Call scripting_search(query, ...)  -> returns results with id field\n2. Call scripting_get_document(doc_id) -> get complete document including full content\n\nArgs:\n    doc_id: The document identifier (integer) from scripting_search results\n\nReturns:\n    Full document data including all metadata, full content, and all documentation fields\n\nRaises:\n    ToolError: If document is not found or database query fails","inputSchema":null},{"name":"list_methods","description":"PRIMARY DISCOVERY TOOL - Retrieve all available methods for a ServiceNow API.\n\n**CRITICAL - You MUST call this tool first when**:\n- User mentions a specific API name (e.g., \"GlideRecord\", \"GlideAjax\", \"GlideAggregate\")\n- User asks about methods for an API (e.g., \"What methods does GlideRecord have?\")\n- User asks about a specific method (e.g., \"How does insert() work?\")\n- User wants examples/parameters/returns of a method\n\nThis is the MANDATORY FIRST STEP of the Discovery Track. Do not skip this.\n\n**ONLY skip this tool if**:\n- User asks a broad/conceptual question WITHOUT mentioning an API\n- User explicitly requests semantic search across multiple APIs\n- You already recently called this tool for this API\n\n**Why this tool is mandatory**:\n- Returns exact method names for follow-up tool calls\n- Verifies API and method exist before requesting specific details\n- Avoids wasting tokens on semantic search when API is known\n- Provides full method descriptions for context and understanding\n- Enables informed selection of which specific tool to call next\n\n**MANDATORY DISCOVERY TRACK WORKFLOW**:\nUser asks: \"Show me GlideRecord insert examples\"\n\nStep 1 (MANDATORY): scripting_list_methods(api=\"GlideRecord\")\nStep 2: Review method descriptions, find \"insert\" in results\nStep 3: scripting_get_examples(api=\"GlideRecord\", method_name=\"insert\")\nStep 4 (optional): scripting_get_parameters() and/or scripting_get_returns() for more details\n\n**Other common scenarios**:\nUser: \"What methods does GlideAjax have?\"\n-> Just call scripting_list_methods(api=\"GlideAjax\"), return results\n\nUser: \"How do I use the query method on GlideRecord?\"\n-> Call scripting_list_methods(api=\"GlideRecord\") first to verify it exists\n-> Then call scripting_get_examples/scripting_get_parameters/scripting_get_returns with exact method_name\n\nUser: \"How do I create records?\"\n-> This is BROAD, doesn't mention API -> Use semantic search (scripting_search)\n-> Do NOT use this tool\n\n**What to do with results**:\n- If user asked \"what methods does X have?\" -> Present the list with brief descriptions\n- If user asked about a specific method -> Find it in results, then call scripting_get_examples/scripting_get_parameters/scripting_get_returns\n- If method not found -> Tell user the method doesn't exist for this API\n- If API returns empty -> API name may be incorrect, suggest alternatives or check spelling\n\nArgs:\n    api: ServiceNow API name (e.g., \"GlideRecord\", \"GlideAjax\", \"GlideAggregate\", \"gs\")\n\nReturns:\n    List of method description documents with:\n    - id: Document ID\n    - api: ServiceNow API name\n    - method_name: Method name\n    - section: Will always be \"method_description\"\n    - content: The method description documentation (includes detailed description of the method)\n    - metadata: JSONB metadata including:\n        - url: Link to official ServiceNow documentation\n        - scopes: Array of supported scopes ([\"Global\"], [\"Scoped\"], or both)\n        - release: ServiceNow release (e.g., \"Zurich\", \"Vancouver\")\n\n    Empty list if no methods are found for the API.\n\nRaises:\n    ToolError: If input validation fails or database query fails\n\nExamples:\n    # Get all method descriptions for GlideRecord\n    scripting_list_methods(api=\"GlideRecord\")\n\n    # Get all method descriptions for GlideAjax\n    scripting_list_methods(api=\"GlideAjax\")","inputSchema":null},{"name":"get_examples","description":"Retrieve code examples for a specific ServiceNow API and method.\n\n**Prerequisites** (you must have done this first):\nYou SHOULD have called scripting_list_methods(api=...) before calling this tool\nto verify the API and method exist. This avoids wasting tokens on non-existent methods.\n\nONLY skip scripting_list_methods if:\n- User explicitly provided api+method combination in their question\n- You recently called scripting_list_methods for this API\n\n**When to use**: Call this to get code examples that demonstrate how to use a\nspecific ServiceNow API method. Perfect for showing working code or generating\nexample implementations.\n\n**Use cases**:\n- User asks: \"Show me an example of how to use GlideRecord.insert()\"\n- You need to provide working code snippets to demonstrate API usage\n- Generating documentation or code templates for ServiceNow development\n\n**MANDATORY WORKFLOW** (when user asks about a method):\n1. scripting_list_methods(api=\"GlideRecord\") <- MUST DO THIS FIRST\n2. Verify method exists in results\n3. scripting_get_examples(api=\"GlideRecord\", method_name=\"insert\")\n4. (optional) scripting_get_parameters() and/or scripting_get_returns() for complete documentation\n\n**Response Format** (how to present results):\nWhen you get results from this tool:\n1. State what you found: \"Found 3 code examples for GlideRecord.insert()\"\n2. Explain relevance: \"These examples show how to create records using GlideRecord\"\n3. Present the code: Display the content field with proper formatting\n4. Include metadata: Mention the official ServiceNow documentation URL\n5. If no examples found: Suggest calling scripting_list_methods to verify method exists\n\n**If no examples found**:\n1. The method exists but has no code examples in documentation\n2. Offer to show parameters or return values instead\n3. Suggest the user check the official ServiceNow docs URL from scripting_list_methods results\n\nArgs:\n    api: ServiceNow API name (e.g., \"GlideRecord\", \"GlideAjax\", \"GlideAggregate\", \"gs\")\n    method_name: Method name (e.g., \"insert\", \"update\", \"query\", \"delete\")\n\nReturns:\n    List of example documents with:\n    - id: Document ID\n    - api: ServiceNow API name\n    - method_name: Method name\n    - section: Will always be \"example\"\n    - content: The example code and documentation (includes example code and description of the example)\n    - metadata: JSONB metadata including:\n        - url: Link to official ServiceNow documentation\n        - scopes: Array of supported scopes ([\"Global\"], [\"Scoped\"], or both)\n        - release: ServiceNow release (e.g., \"Zurich\", \"Vancouver\")\n\n    Empty list if no examples are found for the combination.\n\nRaises:\n    ToolError: If input validation fails or database query fails\n\nExamples:\n    # Get all examples for GlideRecord insert method\n    scripting_get_examples(api=\"GlideRecord\", method_name=\"insert\")\n\n    # Get examples for GlideAjax getXML method\n    scripting_get_examples(api=\"GlideAjax\", method_name=\"getXML\")","inputSchema":null},{"name":"get_returns","description":"Retrieve return value documentation for a specific ServiceNow API and method.\n\n**Prerequisites** (you must have done this first):\nYou SHOULD have called scripting_list_methods(api=...) before calling this tool\nto verify the API and method exist. This avoids wasting tokens on non-existent methods.\n\nONLY skip scripting_list_methods if:\n- User explicitly provided api+method combination in their question\n- You recently called scripting_list_methods for this API\n\n**When to use**: Call this to get return value documentation that describes what\na method returns. Use this when you need to know what a method returns or what\ntype of value is returned.\n\n**Use cases**:\n- User asks: \"What does the query() method return?\"\n- You need to document return types for a method\n- Providing type information and return value descriptions\n\n**MANDATORY WORKFLOW** (when user asks about method returns):\n1. scripting_list_methods(api=\"GlideRecord\") <- MUST DO THIS FIRST\n2. Verify method exists in results\n3. scripting_get_returns(api=\"GlideRecord\", method_name=\"query\")\n4. (optional) scripting_get_examples() and/or scripting_get_parameters() for complete documentation\n\n**Response Format** (how to present results):\nWhen you get results from this tool:\n1. State what you found: \"Found return value documentation for GlideRecord.query()\"\n2. Explain relevance: \"This documents what the query() method returns\"\n3. Present the documentation: Display the content field with clear formatting\n4. Include metadata: Mention the official ServiceNow documentation URL\n5. If no results found: Suggest calling scripting_list_methods to verify method exists\n\n**If no results found**:\n1. Check spelling of api and method_name\n2. Call scripting_list_methods(api=...) to see available methods\n3. The method may not have return value documentation\n\nArgs:\n    api: ServiceNow API name (e.g., \"GlideRecord\", \"GlideAjax\", \"GlideAggregate\", \"gs\")\n    method_name: Method name (e.g., \"insert\", \"update\", \"query\", \"delete\")\n\nReturns:\n    List of return value documents with:\n    - id: Document ID\n    - api: ServiceNow API name\n    - method_name: Method name\n    - section: Will always be \"returns\"\n    - content: The return value documentation (includes description of return types and values)\n    - metadata: JSONB metadata including:\n        - url: Link to official ServiceNow documentation\n        - scopes: Array of supported scopes ([\"Global\"], [\"Scoped\"], or both)\n        - release: ServiceNow release (e.g., \"Zurich\", \"Vancouver\")\n\n    Empty list if no return value documentation is found for the combination.\n\nRaises:\n    ToolError: If input validation fails or database query fails\n\nExamples:\n    # Get return value documentation for GlideRecord query method\n    scripting_get_returns(api=\"GlideRecord\", method_name=\"query\")\n\n    # Get return value documentation for GlideAjax getXML method\n    scripting_get_returns(api=\"GlideAjax\", method_name=\"getXML\")","inputSchema":null},{"name":"get_parameters","description":"Retrieve parameter documentation for a specific ServiceNow API and method.\n\n**Prerequisites** (you must have done this first):\nYou SHOULD have called scripting_list_methods(api=...) before calling this tool\nto verify the API and method exist. This avoids wasting tokens on non-existent methods.\n\nONLY skip scripting_list_methods if:\n- User explicitly provided api+method combination in their question\n- You recently called scripting_list_methods for this API\n\n**When to use**: Call this to get parameter documentation that describes what\nparameters a method accepts. Use this when you need to know what arguments a\nmethod takes and their descriptions.\n\n**Use cases**:\n- User asks: \"What parameters does the query() method accept?\"\n- You need to document method parameters and their types\n- Providing parameter names, types, and descriptions\n\n**MANDATORY WORKFLOW** (when user asks about method parameters):\n1. scripting_list_methods(api=\"GlideRecord\") <- MUST DO THIS FIRST\n2. Verify method exists in results\n3. scripting_get_parameters(api=\"GlideRecord\", method_name=\"query\")\n4. (optional) scripting_get_examples() and/or scripting_get_returns() for complete documentation\n\n**Response Format** (how to present results):\nWhen you get results from this tool:\n1. State what you found: \"Found parameter documentation for GlideRecord.query()\"\n2. Explain relevance: \"These are the parameters accepted by the query() method\"\n3. Present the documentation: Display the content field with clear formatting\n4. Include metadata: Mention the official ServiceNow documentation URL\n5. If no results found: Suggest calling scripting_list_methods to verify method exists\n\n**If no results found**:\n1. Check spelling of api and method_name\n2. Call scripting_list_methods(api=...) to see available methods\n3. The method may not have parameter documentation (some methods take no parameters)\n\nArgs:\n    api: ServiceNow API name (e.g., \"GlideRecord\", \"GlideAjax\", \"GlideAggregate\", \"gs\")\n    method_name: Method name (e.g., \"insert\", \"update\", \"query\", \"delete\")\n\nReturns:\n    List of parameter documents with:\n    - id: Document ID\n    - api: ServiceNow API name\n    - method_name: Method name\n    - section: Will always be \"parameter\"\n    - content: The parameter documentation (includes parameter names, types, and descriptions)\n    - metadata: JSONB metadata including:\n        - url: Link to official ServiceNow documentation\n        - scopes: Array of supported scopes ([\"Global\"], [\"Scoped\"], or both)\n        - release: ServiceNow release (e.g., \"Zurich\", \"Vancouver\")\n\n    Empty list if no parameter documentation is found for the combination.\n\nRaises:\n    ToolError: If input validation fails or database query fails\n\nExamples:\n    # Get parameter documentation for GlideRecord query method\n    scripting_get_parameters(api=\"GlideRecord\", method_name=\"query\")\n\n    # Get parameter documentation for GlideAjax getXML method\n    scripting_get_parameters(api=\"GlideAjax\", method_name=\"getXML\")","inputSchema":null},{"name":"search_objects","description":"Search for ServiceNow Fluent API objects using semantic similarity.\n\nThis tool performs vector-based semantic search to find relevant fluent objects\nby matching the meaning of your query across available fluent object names.\n\n**CRITICAL DECISION RULE - Read this first**:\n\nYou MUST follow this rule:\n\nIF user asks a BROAD/CONCEPTUAL question about FLUENT objects WITHOUT knowing the object name:\n   - User: \"What fluent objects handle user data?\"\n   - User: \"Find configuration fluent objects\"\n   - USE THIS TOOL: fluent_search_objects()\n\nIF user mentions a SPECIFIC FLUENT OBJECT name:\n   - User: \"Show me properties of UserProfile fluent object\"\n   - User: \"What properties does ConfigurationSettings have?\"\n   - DO NOT USE THIS TOOL\n   - INSTEAD use DISCOVERY TRACK (see fluent_list_properties)\n\n**When to use this tool**:\n- Broad questions about fluent objects: \"What objects handle workflow?\"\n- Unknown fluent object: \"What object manages notifications?\"\n- Conceptual/exploratory queries: \"ServiceNow configuration objects\"\n- Discovering available fluent objects\n\n**When NOT to use** (MUST use Discovery Track instead):\n- User mentions specific fluent object -> Use fluent_list_properties first\n- User asks about specific properties -> Use fluent_list_properties first\n\n**How to construct effective queries**:\nThis tool uses semantic search (like Google), not exact keyword matching. Transform the user's\nnatural language question into keyword-focused search terms for best results:\n- User asks: \"What objects handle user management?\"\n- Convert to: \"user management profile object\" (NOT \"FluentUser\" - unknown which object)\n- User asks: \"Configuration objects\"\n- Convert to: \"configuration settings object\"\n\n**Query Construction Tips**:\n- BAD: \"What is the UserProfile fluent object?\" (mentions specific object - use Discovery Track)\n- GOOD: \"user profile data object\" (exploratory, no specific object)\n- BAD: \"What objects exist?\" (too vague)\n- GOOD: \"available service objects configuration\" (keyword-focused)\n\n**Best practices**:\n- Use for EXPLORATORY searches (don't know the fluent object yet)\n- Keep queries concise (3-10 keywords typically works best)\n- If query mentions fluent object name, switch to Discovery Track\n\n**Workflow**:\n1. User asks broad question about fluent objects\n2. Convert question to keywords\n3. Call fluent_search_objects() with keyword query\n4. Optionally: Call fluent_get_document() for full document\n\nArgs:\n    query: Keyword-focused search query (e.g., \"user profile object\", \"workflow configuration\", \"notification settings\")\n           NOT a full question - transform questions into keywords for better semantic search results\n    limit: Maximum number of results (default: 5, max: 20)\n\nReturns:\n    List of FluentSearchResult objects with:\n    - id: Document ID\n    - fluent_object: ServiceNow fluent object name\n    - property_name: Property name (may be None for object-level results)\n    - section: Section type (property_datatype, property_description, etc.)\n    - content: Documentation content\n    - metadata: JSONB metadata including:\n        - url: Link to official ServiceNow documentation\n        - scopes: Array of supported scopes ([\"Global\"], [\"Scoped\"], or both)\n        - release: ServiceNow release (e.g., \"Zurich\")\n    - similarity: Relevance score (0-1, higher is more relevant)\n\nRaises:\n    ToolError: If input validation fails or search fails","inputSchema":null},{"name":"get_document","description":"Retrieve a specific ServiceNow Fluent API documentation entry by ID.\n\n**When to use**: After calling fluent_search_objects(), you get documents with IDs\nand similarity scores. Use this tool to fetch the full content of a specific result.\n\n**Use case**: User asks \"Tell me more about that last fluent object result\" or you want complete\ndocumentation for a document returned from fluent search.\n\n**Typical workflow**:\n1. Call fluent_search_objects(query, ...)  -> returns results with id field\n2. Call fluent_get_document(doc_id) -> get complete document including full content\n\nArgs:\n    doc_id: The document identifier (integer) from fluent_search_objects results\n\nReturns:\n    Full document data including all metadata, full content, and all documentation fields\n\nRaises:\n    ToolError: If document is not found or database query fails","inputSchema":null},{"name":"list_properties","description":"PRIMARY DISCOVERY TOOL - Retrieve all available properties for a ServiceNow Fluent API object.\n\n**CRITICAL - You MUST call this tool first when**:\n- User mentions a specific fluent object name (e.g., \"UserProfile\", \"ConfigurationSettings\")\n- User asks about properties of a fluent object (e.g., \"What properties does UserProfile have?\")\n- User asks about a specific property (e.g., \"How does email property work?\")\n- User wants examples/datatypes/required info of a property\n\nThis is the MANDATORY FIRST STEP of the Fluent Discovery Track. Do not skip this.\n\n**ONLY skip this tool if**:\n- User asks a broad/conceptual question about fluent objects WITHOUT mentioning a specific object\n- User explicitly requests semantic search across multiple fluent objects\n- You already recently called this tool for this fluent object\n\n**Why this tool is mandatory**:\n- Returns exact property names for follow-up tool calls\n- Verifies fluent object and property exist before requesting specific details\n- Avoids wasting tokens on semantic search when fluent object is known\n- Provides full property descriptions for context and understanding\n- Enables informed selection of which specific tool to call next\n\n**MANDATORY FLUENT DISCOVERY TRACK WORKFLOW**:\nUser asks: \"Show me UserProfile email property examples\"\n\nStep 1 (MANDATORY): fluent_list_properties(fluent_object=\"UserProfile\")\nStep 2: Review property descriptions, find \"email\" in results\nStep 3: fluent_get_property(fluent_object=\"UserProfile\", property_name=\"email\")\nStep 4 (optional): get_fluent_property_datatype(), get_fluent_property_examples(), etc.\n\n**Other common scenarios**:\nUser: \"What properties does ConfigurationSettings have?\"\n-> Just call fluent_list_properties(fluent_object=\"ConfigurationSettings\"), return results\n\nUser: \"How do I use the email property on UserProfile?\"\n-> Call fluent_list_properties(fluent_object=\"UserProfile\") first to verify it exists\n-> Then call fluent_get_property with exact property_name\n\nUser: \"How do I handle user data?\"\n-> This is BROAD, doesn't mention fluent object -> Use semantic search (fluent_search_objects)\n-> Do NOT use this tool\n\n**What to do with results**:\n- If user asked \"what properties does X have?\" -> Present the list with brief descriptions\n- If user asked about a specific property -> Find it in results, then call fluent_get_property\n- If property not found -> Tell user the property doesn't exist for this fluent object\n- If fluent object returns empty -> Fluent object name may be incorrect, suggest alternatives or check spelling\n\nArgs:\n    fluent_object: ServiceNow fluent object name (e.g., \"UserProfile\", \"ConfigurationSettings\", \"WorkflowConfig\")\n\nReturns:\n    List of property description documents with:\n    - id: Document ID\n    - fluent_object: ServiceNow fluent object name\n    - property_name: Property name\n    - section: Will always be \"property_description\"\n    - content: The property description documentation\n    - metadata: JSONB metadata including:\n        - url: Link to official ServiceNow documentation\n        - scopes: Array of supported scopes ([\"Global\"], [\"Scoped\"], or both)\n        - release: ServiceNow release (e.g., \"Zurich\", \"Vancouver\")\n\n    Empty list if no properties are found for the fluent object.\n\nRaises:\n    ToolError: If input validation fails or database query fails\n\nExamples:\n    # Get all property descriptions for UserProfile fluent object\n    fluent_list_properties(fluent_object=\"UserProfile\")\n\n    # Get all property descriptions for ConfigurationSettings fluent object\n    fluent_list_properties(fluent_object=\"ConfigurationSettings\")","inputSchema":null},{"name":"get_property","description":"Retrieve complete information for a specific ServiceNow Fluent API property.\n\n**Prerequisites** (you must have done this first):\nYou SHOULD have called fluent_list_properties(fluent_object=...) before calling this tool\nto verify the fluent object and property exist. This avoids wasting tokens on non-existent properties.\n\nONLY skip fluent_list_properties if:\n- User explicitly provided fluent_object+property_name combination in their question\n- You recently called fluent_list_properties for this fluent object\n\n**When to use**: Call this to get all available documentation for a specific fluent property.\nThis provides comprehensive information including datatype, description, examples, required status, and valid values.\n\n**Use cases**:\n- User asks: \"Tell me about the email property on UserProfile\"\n- You need complete documentation for implementing a fluent property\n- Getting all property details in one call\n\n**MANDATORY WORKFLOW** (when user asks about a property):\n1. fluent_list_properties(fluent_object=\"UserProfile\") <- MUST DO THIS FIRST\n2. Verify property exists in results\n3. fluent_get_property(fluent_object=\"UserProfile\", property_name=\"email\")\n4. (optional) Use specific getters for individual sections if needed\n\n**Response Format** (how to present results):\nWhen you get results from this tool:\n1. State what you found: \"Found complete documentation for UserProfile.email property\"\n2. Organize by section type: Group datatype, description, examples, etc.\n3. Present each section clearly with formatting\n4. Include metadata: Mention the official ServiceNow documentation URL\n\n**If no results found**:\n1. Check spelling of fluent_object and property_name\n2. Call fluent_list_properties(fluent_object=...) to see available properties\n3. The property may not have complete documentation\n\nArgs:\n    fluent_object: ServiceNow fluent object name (e.g., \"UserProfile\", \"ConfigurationSettings\")\n    property_name: Property name (e.g., \"email\", \"firstName\", \"isActive\")\n\nReturns:\n    List of all documentation sections for the property with:\n    - id: Document ID\n    - fluent_object: ServiceNow fluent object name\n    - property_name: Property name\n    - section: Section type (property_datatype, property_description, property_example, property_required, property_valid_values)\n    - content: The documentation content for that section\n    - metadata: JSONB metadata including:\n        - url: Link to official ServiceNow documentation\n        - scopes: Array of supported scopes ([\"Global\"], [\"Scoped\"], or both)\n        - release: ServiceNow release (e.g., \"Zurich\", \"Vancouver\")\n\n    Empty list if no documentation is found for the combination.\n\nRaises:\n    ToolError: If input validation fails or database query fails\n\nExamples:\n    # Get all documentation for UserProfile email property\n    fluent_get_property(fluent_object=\"UserProfile\", property_name=\"email\")\n\n    # Get all documentation for ConfigurationSettings timeout property\n    fluent_get_property(fluent_object=\"ConfigurationSettings\", property_name=\"timeout\")","inputSchema":null},{"name":"search","description":"Search for ServiceNow SDK documentation using semantic similarity.\n\nThis tool performs vector-based semantic search to find relevant SDK documentation\nby matching the meaning of your query across available SDK documentation.\n\n**When to use this tool**:\n- Broad questions about SDK functionality: \"What SDK objects handle data?\"\n- Unknown SDK object: \"What objects manage configuration?\"\n- Conceptual/exploratory queries: \"ServiceNow SDK objects\"\n- Discovering available SDK documentation\n\n**How to construct effective queries**:\nThis tool uses semantic search (like Google), not exact keyword matching. Transform the user's\nnatural language question into keyword-focused search terms for best results:\n- User asks: \"What objects handle user management?\"\n- Convert to: \"user management profile object\"\n- User asks: \"SDK configuration objects\"\n- Convert to: \"configuration settings object\"\n\n**Query Construction Tips**:\n- BAD: \"What is the DateTimeColumn object?\" (too specific, might not exist)\n- GOOD: \"datetime column object data type\" (exploratory)\n- BAD: \"What objects exist?\" (too vague)\n- GOOD: \"available service objects configuration\" (keyword-focused)\n\n**Best practices**:\n- Use for EXPLORATORY searches (don't know the SDK object yet)\n- Keep queries concise (3-10 keywords typically works best)\n\n**Workflow**:\n1. User asks broad question about SDK functionality\n2. Convert question to keywords\n3. Call sdk_search() with keyword query\n\nArgs:\n    query: Keyword-focused search query (e.g., \"user profile object\", \"datetime column\", \"configuration settings\")\n           NOT a full question - transform questions into keywords for better semantic search results\n    match_threshold: Similarity threshold (0.0 to 1.0, default: 0.8)\n    match_count: Maximum number of results (default: 10, max: 20)\n\nReturns:\n    List of matching SDK documents with similarity scores\n\nRaises:\n    ToolError: If input validation fails or search fails","inputSchema":null},{"name":"sdk_get_document","description":"Retrieve a specific ServiceNow SDK documentation entry by ID.\n\n**When to use**: After calling sdk_search(), you get documents with IDs\nand similarity scores. Use this tool to fetch the full content of a specific result.\n\n**Use case**: User asks \"Tell me more about that last result\" or you want complete\ndocumentation for a document returned from search.\n\n**Typical workflow**:\n1. Call sdk_search(query, ...)  -> returns results with id field\n2. Call sdk_get_document(doc_id) -> get complete document including full content\n\nArgs:\n    doc_id: The document identifier (integer) from sdk_search results\n\nReturns:\n    Full document data including all metadata, full content, and all documentation fields\n\nRaises:\n    ToolError: If document is not found or database query fails","inputSchema":null}],"prompts":[{"name":"servicenow-developer","description":"General ServiceNow development assistant","arguments":[{"name":"focus","description":null,"required":true}]},{"name":"servicenow-script-include-builder","description":"Script Include development assistant","arguments":[]},{"name":"servicenow-business-rule-creator","description":"Business Rule development assistant","arguments":[]},{"name":"servicenow-client-script-writer","description":"Client-side scripting assistant","arguments":[]},{"name":"servicenow-code-reviewer","description":"Code review assistant","arguments":[{"name":"code","description":"Provide as a JSON string matching the following schema: {\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]}","required":true}]},{"name":"servicenow-incident-management","description":"Incident management and automation specialist","arguments":[]},{"name":"servicenow-change-management","description":"Change management and CAB automation specialist","arguments":[]},{"name":"servicenow-cmdb-expert","description":"Configuration Management Database specialist","arguments":[]},{"name":"servicenow-debugging-assistant","description":"Debugging and troubleshooting specialist for ServiceNow","arguments":[]},{"name":"servicenow-performance-optimizer","description":"Performance optimization specialist for ServiceNow","arguments":[]}],"authentication":{"type":"API Key","required":"All requests require authentication","header_format":"Authorization: Bearer sc_your_api_key","key_format":"Keys start with 'sc_' prefix","storage":"Database-backed (PostgreSQL)","note":"API keys are validated against the api_keys table using SHA-256 hashing"},"endpoints":{"mcp_protocol":"/mcp","documentation":"/","health":"/health"},"usage":{"mcp_protocol_endpoint":"/mcp","transport":"Streamable HTTP","discovery":"MCP clients can discover and call tools via the MCP protocol","prompts":"Use prompts/list and prompts/get to access coding assistant prompts","note":"This endpoint (/) provides human-readable documentation. MCP clients should use /mcp"}}