MCP 서버

self-hosted-ai

org.sovgrid/self-hosted-ai

이 MCP로 할 수 있는 일

Provides searchable engineering documentation for self-hosted AI systems and validates SGLang configurations for NVIDIA DGX Spark hardware.

diagnose_sglang
Validate an SGLang configuration for NVIDIA DGX Spark (GB10/SM121A). Pure pattern-matching against known failure modes documented in the Sovereign AI Blog. No inference, no external calls. Returns critical issues, non-fatal warnings, and a recommended baseline config. All parameters are optional; supply only what you have. With no inputs you get the recommended config and a 'unknown' verdict.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'title': 'diagnose_sglangArguments', 'properties': {'hardware': {'type': 'string', 'title': 'Hardware', 'default': '', 'description': "Hardware description (e.g. 'GB10', 'DGX Spark', 'SM121A'). Empty = skip GB10-specific rules."}, 'image_tag': {'type': 'string', 'title': 'Image Tag', 'default': '', 'description': "Docker image tag in use (e.g. 'lmsysorg/sglang:latest', 'lmsysorg/sglang:v0.4.0'). Empty = skip."}, 'mem_fraction': {'type': 'number', 'title': 'Mem Fraction', 'default': 0.0, 'maximum': 1.0, 'minimum': 0.0, 'description': 'SGLang --mem-fraction-static value (e.g. 0.88). 0.0 = skip this check.'}, 'error_message': {'type': 'string', 'title': 'Error Message', 'default': '', 'description': 'Paste error log output here for pattern matching against known failure modes.'}, 'attention_backend': {'type': 'string', 'title': 'Attention Backend', 'default': '', 'description': "SGLang --attention-backend value (e.g. 'flashinfer', 'triton'). Empty string = skip this check."}, 'cuda_graph_max_bs': {'type': 'integer', 'title': 'Cuda Graph Max Bs', 'default': 0, 'minimum': 0, 'description': 'SGLang --cuda-graph-max-bs value. 0 = skip this check.'}}}
출력 스키마
{'type': 'object', '$defs': {'DiagnosticIssue': {'type': 'object', 'title': 'DiagnosticIssue', 'required': ['severity', 'param', 'value', 'problem', 'fix', 'source'], 'properties': {'fix': {'type': 'string', 'title': 'Fix', 'description': 'Concrete fix to apply'}, 'param': {'type': 'string', 'title': 'Param', 'description': 'The config parameter or input field that triggered the rule'}, 'value': {'type': 'string', 'title': 'Value', 'description': 'The offending value (stringified)'}, 'source': {'type': 'string', 'title': 'Source', 'description': 'URL of the blog article documenting this issue'}, 'problem': {'type': 'string', 'title': 'Problem', 'description': 'Plain-English explanation of the failure mode'}, 'severity': {'enum': ['critical', 'warning'], 'type': 'string', 'title': 'Severity', 'description': 'critical = config will fail, warning = will run but suboptimal'}}, 'description': 'A single rule violation found in the SGLang config.'}, 'RecommendedConfig': {'type': 'object', 'title': 'RecommendedConfig', 'required': ['attention_backend', 'mem_fraction', 'cuda_graph_max_bs', 'image_tag', 'env', 'max_running_requests'], 'properties': {'env': {'type': 'object', 'title': 'Env', 'description': 'Environment variables required for stable operation', 'additionalProperties': True}, 'image_tag': {'type': 'string', 'title': 'Image Tag', 'description': 'Docker image tag with SM121A support'}, 'mem_fraction': {'type': 'number', 'title': 'Mem Fraction', 'description': '--mem-fraction-static value (0.75 is the upper safe bound for GB10)'}, 'attention_backend': {'type': 'string', 'title': 'Attention Backend', 'description': 'SGLang attention backend (triton is the verified default for GB10)'}, 'cuda_graph_max_bs': {'type': 'integer', 'title': 'Cuda Graph Max Bs', 'description': '--cuda-graph-max-bs (32 is the optimum for GB10)'}, 'max_running_requests': {'type': 'integer', 'title': 'Max Running Requests', 'description': 'Concurrent request cap, calibrated for GB10 memory budget'}}, 'description': 'A known-good SGLang config baseline for GB10/SM121A hardware.'}}, 'title': 'DiagnoseResult', 'required': ['issues', 'warnings', 'recommended_config', 'verdict'], 'properties': {'issues': {'type': 'array', 'items': {'$ref': '#/$defs/DiagnosticIssue'}, 'title': 'Issues', 'description': 'Critical issues that will prevent SGLang from running correctly'}, 'verdict': {'enum': ['valid', 'valid_with_warnings', 'invalid', 'unknown'], 'type': 'string', 'title': 'Verdict', 'description': "Overall verdict. 'unknown' = no inputs provided."}, 'warnings': {'type': 'array', 'items': {'$ref': '#/$defs/DiagnosticIssue'}, 'title': 'Warnings', 'description': 'Non-fatal warnings (suboptimal but non-blocking)'}, 'recommended_config': {'$ref': '#/$defs/RecommendedConfig', 'description': 'Verified-good baseline config for GB10/SM121A'}}, 'description': 'Outcome of a diagnose_sglang call.'}
get_article
Retrieve the full content of a blog article by its slug. Returns the article body (Markdown) plus metadata. If the slug does not match any article, returns an Article with `error='article_not_found'` and other fields at their defaults.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'title': 'get_articleArguments', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'title': 'Slug', 'description': "Article slug as returned by search_blog (e.g. 'setup-llm-inference-setup'). Lower-case, hyphenated."}}}
출력 스키마
{'type': 'object', 'title': 'Article', 'required': ['slug'], 'properties': {'url': {'type': 'string', 'title': 'Url', 'default': '', 'description': 'Public URL of the article'}, 'body': {'type': 'string', 'title': 'Body', 'default': '', 'description': 'Full article body in Markdown'}, 'date': {'type': 'string', 'title': 'Date', 'default': '', 'description': 'Publication date (ISO 8601)'}, 'slug': {'type': 'string', 'title': 'Slug', 'description': 'Article slug'}, 'tags': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Tags', 'description': 'Topic tags assigned to the article'}, 'error': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Error', 'default': None, 'description': "Set to 'article_not_found' if no article matches the slug"}, 'title': {'type': 'string', 'title': 'Title', 'default': '', 'description': 'Article title'}, 'word_count': {'type': 'integer', 'title': 'Word Count', 'default': 0, 'description': 'Word count of the article body'}, 'description': {'type': 'string', 'title': 'Description', 'default': '', 'description': 'Short article description'}, 'quality_class': {'type': 'string', 'title': 'Quality Class', 'default': '', 'description': "Editorial content class (e.g. 'Ephemeral', 'Evergreen'). Empty if not classified."}, 'quality_score': {'type': 'number', 'title': 'Quality Score', 'default': 0.0, 'description': 'Build-time quality score from the editorial pipeline (unbounded weighted composite across 13 signals, higher is better; thresholds depend on style)'}, 'quality_style': {'type': 'string', 'title': 'Quality Style', 'default': '', 'description': "Editorial style category (e.g. 'best_practice_learnings', 'werthaltige_code_beispiele'). Empty if not categorised."}}, 'description': 'Full content of a single blog article.'}
list_articles
List all blog articles. No TF-IDF computation — pure database listing. Use to browse the full corpus, paginate through articles, or filter by tag. For full-text semantic search use search_blog instead.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'title': 'list_articlesArguments', 'properties': {'tag': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Tag', 'default': None, 'description': "Optional tag filter (e.g. 'setup', 'fixes', 'strategy'). Only articles with this tag are considered. Use list_tags to discover available tags."}, 'sort': {'enum': ['date_desc', 'date_asc', 'title_asc', 'quality_desc'], 'type': 'string', 'title': 'Sort', 'default': 'date_desc', 'description': "Result ordering. 'date_desc' newest first (default). 'date_asc' oldest first. 'title_asc' alphabetical. 'quality_desc' best quality first."}, 'limit': {'type': 'integer', 'title': 'Limit', 'default': 20, 'maximum': 50, 'minimum': 1, 'description': 'Number of results (1-50)'}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0, 'description': 'Pagination offset (0-based)'}}}
출력 스키마
{'type': 'object', '$defs': {'ArticleSummary': {'type': 'object', 'title': 'ArticleSummary', 'required': ['slug', 'title', 'url', 'tags', 'quality_score'], 'properties': {'url': {'type': 'string', 'title': 'Url', 'description': 'Public URL of the article'}, 'date': {'type': 'string', 'title': 'Date', 'default': '', 'description': 'Publication date (ISO 8601)'}, 'slug': {'type': 'string', 'title': 'Slug', 'description': 'Article slug, use as input to get_article'}, 'tags': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Tags', 'description': 'Topic tags assigned to the article'}, 'title': {'type': 'string', 'title': 'Title', 'description': 'Article title'}, 'description': {'type': 'string', 'title': 'Description', 'default': '', 'description': 'Article description or summary'}, 'quality_class': {'type': 'string', 'title': 'Quality Class', 'default': '', 'description': 'Editorial quality class'}, 'quality_score': {'type': 'number', 'title': 'Quality Score', 'description': 'Editorial quality score'}, 'quality_style': {'type': 'string', 'title': 'Quality Style', 'default': '', 'description': 'Editorial style category'}}, 'description': 'A single article entry returned by list_articles.'}}, 'title': 'list_articlesOutput', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'$ref': '#/$defs/ArticleSummary'}, 'title': 'Result'}}}
list_tags
List all topic tags used across the Sovereign AI Blog corpus, with article counts. Use this to browse the topic space before calling search_blog with a tag filter.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'title': 'list_tagsArguments', 'properties': {'sort': {'enum': ['count_desc', 'alpha'], 'type': 'string', 'title': 'Sort', 'default': 'count_desc', 'description': "Result ordering. 'count_desc' lists most-used tags first (default). 'alpha' sorts alphabetically."}}}
출력 스키마
{'type': 'object', '$defs': {'TagInfo': {'type': 'object', 'title': 'TagInfo', 'required': ['tag', 'article_count'], 'properties': {'tag': {'type': 'string', 'title': 'Tag', 'description': 'The tag name (lower-case, snake_case)'}, 'article_count': {'type': 'integer', 'title': 'Article Count', 'description': 'Number of articles tagged with this tag'}}, 'description': 'A topic tag with the number of articles using it.'}}, 'title': 'list_tagsOutput', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'$ref': '#/$defs/TagInfo'}, 'title': 'Result'}}}
search_blog
Search the Sovereign AI Blog for articles matching a natural language query, optionally filtered by tag and sorted by relevance or date. Behaviour matrix: - query='', sort=* -> list newest-first, optionally tag-filtered - query!='', sort=relevance -> TF-IDF ranked, optionally tag-filtered - query!='', sort=date_desc -> TF-IDF filtered (score > 0.001), then sorted by date Pure read-only, deterministic for a given KB snapshot.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'title': 'search_blogArguments', 'properties': {'n': {'type': 'integer', 'title': 'N', 'default': 5, 'maximum': 20, 'minimum': 1, 'description': 'Maximum number of results to return'}, 'tag': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Tag', 'default': None, 'description': "Optional tag filter (e.g. 'setup', 'fixes', 'strategy'). Only articles with this tag are considered. Use list_tags to discover available tags."}, 'sort': {'enum': ['relevance', 'date_desc'], 'type': 'string', 'title': 'Sort', 'default': 'relevance', 'description': "Result ordering. 'relevance' uses TF-IDF score (default for non-empty query). 'date_desc' sorts newest first (default behaviour when query is empty). When query is empty, 'relevance' is treated as 'date_desc'."}, 'query': {'type': 'string', 'title': 'Query', 'default': '', 'description': "Natural language search query (e.g. 'flashinfer OOM on GB10'). Multi-word queries are tokenized and TF-IDF ranked. Pass empty string to list articles without ranking by relevance."}}}
출력 스키마
{'type': 'object', '$defs': {'SearchResult': {'type': 'object', 'title': 'SearchResult', 'required': ['slug', 'title', 'url', 'description', 'tags', 'relevance_score', 'quality_score'], 'properties': {'url': {'type': 'string', 'title': 'Url', 'description': 'Public URL of the article'}, 'date': {'type': 'string', 'title': 'Date', 'default': '', 'description': 'Publication date (ISO 8601)'}, 'slug': {'type': 'string', 'title': 'Slug', 'description': 'Article slug, use as input to get_article'}, 'tags': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Tags', 'description': 'Topic tags assigned to the article'}, 'title': {'type': 'string', 'title': 'Title', 'description': 'Article title'}, 'description': {'type': 'string', 'title': 'Description', 'description': 'Article description or summary'}, 'quality_score': {'type': 'number', 'title': 'Quality Score', 'description': 'Build-time editorial quality score'}, 'quality_style': {'type': 'string', 'title': 'Quality Style', 'default': '', 'description': 'Editorial style category'}, 'relevance_score': {'type': 'number', 'title': 'Relevance Score', 'description': 'TF-IDF cosine similarity score, 0.0 to 1.0 (1.0 = direct date-sorted hit when query is empty)'}}, 'description': 'One ranked article result from search_blog.'}}, 'title': 'search_blogOutput', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'$ref': '#/$defs/SearchResult'}, 'title': 'Result'}}}
추가됨
list_articles
2026년 9월 23일 2:50 AM
추가됨
list_tags
2026년 9월 17일 12:54 PM
추가됨
diagnose_sglang
2026년 9월 17일 12:54 PM
추가됨
get_article
2026년 9월 17일 12:54 PM
추가됨
search_blog
2026년 9월 17일 12:54 PM