scitex 2.14.0__py3-none-any.whl → 2.15.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scitex/__init__.py +71 -17
- scitex/_env_loader.py +156 -0
- scitex/_mcp_resources/__init__.py +37 -0
- scitex/_mcp_resources/_cheatsheet.py +135 -0
- scitex/_mcp_resources/_figrecipe.py +138 -0
- scitex/_mcp_resources/_formats.py +102 -0
- scitex/_mcp_resources/_modules.py +337 -0
- scitex/_mcp_resources/_session.py +149 -0
- scitex/_mcp_tools/__init__.py +4 -0
- scitex/_mcp_tools/audio.py +66 -0
- scitex/_mcp_tools/diagram.py +11 -95
- scitex/_mcp_tools/introspect.py +210 -0
- scitex/_mcp_tools/plt.py +260 -305
- scitex/_mcp_tools/scholar.py +74 -0
- scitex/_mcp_tools/social.py +27 -0
- scitex/_mcp_tools/template.py +24 -0
- scitex/_mcp_tools/writer.py +17 -210
- scitex/ai/_gen_ai/_PARAMS.py +10 -7
- scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
- scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
- scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
- scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
- scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
- scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
- scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
- scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
- scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +30 -1550
- scitex/ai/classification/timeseries/_sliding_window_core.py +467 -0
- scitex/ai/classification/timeseries/_sliding_window_plotting.py +369 -0
- scitex/audio/README.md +40 -36
- scitex/audio/__init__.py +129 -61
- scitex/audio/_branding.py +185 -0
- scitex/audio/_mcp/__init__.py +32 -0
- scitex/audio/_mcp/handlers.py +59 -6
- scitex/audio/_mcp/speak_handlers.py +238 -0
- scitex/audio/_relay.py +225 -0
- scitex/audio/_tts.py +18 -10
- scitex/audio/engines/base.py +17 -10
- scitex/audio/engines/elevenlabs_engine.py +7 -2
- scitex/audio/mcp_server.py +228 -75
- scitex/canvas/README.md +1 -1
- scitex/canvas/editor/_dearpygui/__init__.py +25 -0
- scitex/canvas/editor/_dearpygui/_editor.py +147 -0
- scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
- scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
- scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
- scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
- scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
- scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
- scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
- scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
- scitex/canvas/editor/_dearpygui/_selection.py +295 -0
- scitex/canvas/editor/_dearpygui/_state.py +93 -0
- scitex/canvas/editor/_dearpygui/_utils.py +61 -0
- scitex/canvas/editor/flask_editor/_core/__init__.py +27 -0
- scitex/canvas/editor/flask_editor/_core/_bbox_extraction.py +200 -0
- scitex/canvas/editor/flask_editor/_core/_editor.py +173 -0
- scitex/canvas/editor/flask_editor/_core/_export_helpers.py +353 -0
- scitex/canvas/editor/flask_editor/_core/_routes_basic.py +190 -0
- scitex/canvas/editor/flask_editor/_core/_routes_export.py +332 -0
- scitex/canvas/editor/flask_editor/_core/_routes_panels.py +252 -0
- scitex/canvas/editor/flask_editor/_core/_routes_save.py +218 -0
- scitex/canvas/editor/flask_editor/_core.py +25 -1684
- scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
- scitex/cli/__init__.py +38 -43
- scitex/cli/audio.py +160 -41
- scitex/cli/capture.py +133 -20
- scitex/cli/introspect.py +488 -0
- scitex/cli/main.py +200 -109
- scitex/cli/mcp.py +60 -34
- scitex/cli/plt.py +414 -0
- scitex/cli/repro.py +15 -8
- scitex/cli/resource.py +15 -8
- scitex/cli/scholar/__init__.py +154 -8
- scitex/cli/scholar/_crossref_scitex.py +296 -0
- scitex/cli/scholar/_fetch.py +25 -3
- scitex/cli/social.py +355 -0
- scitex/cli/stats.py +136 -11
- scitex/cli/template.py +129 -12
- scitex/cli/tex.py +15 -8
- scitex/cli/writer.py +49 -299
- scitex/cloud/__init__.py +41 -2
- scitex/config/README.md +1 -1
- scitex/config/__init__.py +16 -2
- scitex/config/_env_registry.py +256 -0
- scitex/context/__init__.py +22 -0
- scitex/dev/__init__.py +20 -1
- scitex/diagram/__init__.py +42 -19
- scitex/diagram/mcp_server.py +13 -125
- scitex/gen/__init__.py +50 -14
- scitex/gen/_list_packages.py +4 -4
- scitex/introspect/__init__.py +82 -0
- scitex/introspect/_call_graph.py +303 -0
- scitex/introspect/_class_hierarchy.py +163 -0
- scitex/introspect/_core.py +41 -0
- scitex/introspect/_docstring.py +131 -0
- scitex/introspect/_examples.py +113 -0
- scitex/introspect/_imports.py +271 -0
- scitex/{gen/_inspect_module.py → introspect/_list_api.py} +48 -56
- scitex/introspect/_mcp/__init__.py +41 -0
- scitex/introspect/_mcp/handlers.py +233 -0
- scitex/introspect/_members.py +155 -0
- scitex/introspect/_resolve.py +89 -0
- scitex/introspect/_signature.py +131 -0
- scitex/introspect/_source.py +80 -0
- scitex/introspect/_type_hints.py +172 -0
- scitex/io/_save.py +1 -2
- scitex/io/bundle/README.md +1 -1
- scitex/logging/_formatters.py +19 -9
- scitex/mcp_server.py +98 -5
- scitex/os/__init__.py +4 -0
- scitex/{gen → os}/_check_host.py +4 -5
- scitex/plt/__init__.py +245 -550
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
- scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/plt/gallery/README.md +1 -1
- scitex/plt/utils/_hitmap/__init__.py +82 -0
- scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
- scitex/plt/utils/_hitmap/_color_application.py +346 -0
- scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
- scitex/plt/utils/_hitmap/_constants.py +40 -0
- scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
- scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
- scitex/plt/utils/_hitmap/_query.py +113 -0
- scitex/plt/utils/_hitmap.py +46 -1616
- scitex/plt/utils/_metadata/__init__.py +80 -0
- scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
- scitex/plt/utils/_metadata/_artists/_base.py +195 -0
- scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
- scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
- scitex/plt/utils/_metadata/_artists/_images.py +80 -0
- scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
- scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
- scitex/plt/utils/_metadata/_artists/_text.py +106 -0
- scitex/plt/utils/_metadata/_csv.py +416 -0
- scitex/plt/utils/_metadata/_detect.py +225 -0
- scitex/plt/utils/_metadata/_legend.py +127 -0
- scitex/plt/utils/_metadata/_rounding.py +117 -0
- scitex/plt/utils/_metadata/_verification.py +202 -0
- scitex/schema/README.md +1 -1
- scitex/scholar/__init__.py +8 -0
- scitex/scholar/_mcp/crossref_handlers.py +265 -0
- scitex/scholar/core/Scholar.py +63 -1700
- scitex/scholar/core/_mixins/__init__.py +36 -0
- scitex/scholar/core/_mixins/_enrichers.py +270 -0
- scitex/scholar/core/_mixins/_library_handlers.py +100 -0
- scitex/scholar/core/_mixins/_loaders.py +103 -0
- scitex/scholar/core/_mixins/_pdf_download.py +375 -0
- scitex/scholar/core/_mixins/_pipeline.py +312 -0
- scitex/scholar/core/_mixins/_project_handlers.py +125 -0
- scitex/scholar/core/_mixins/_savers.py +69 -0
- scitex/scholar/core/_mixins/_search.py +103 -0
- scitex/scholar/core/_mixins/_services.py +88 -0
- scitex/scholar/core/_mixins/_url_finding.py +105 -0
- scitex/scholar/crossref_scitex.py +367 -0
- scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/scholar/examples/00_run_all.sh +120 -0
- scitex/scholar/jobs/_executors.py +27 -3
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
- scitex/scholar/pdf_download/_cli.py +154 -0
- scitex/scholar/pdf_download/strategies/__init__.py +11 -8
- scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
- scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
- scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
- scitex/scholar/pipelines/_single_steps.py +71 -36
- scitex/scholar/storage/_LibraryManager.py +97 -1695
- scitex/scholar/storage/_mixins/__init__.py +30 -0
- scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
- scitex/scholar/storage/_mixins/_library_operations.py +218 -0
- scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
- scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
- scitex/scholar/storage/_mixins/_resolution.py +376 -0
- scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
- scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
- scitex/security/README.md +3 -3
- scitex/session/README.md +1 -1
- scitex/session/__init__.py +26 -7
- scitex/session/_decorator.py +1 -1
- scitex/sh/README.md +1 -1
- scitex/sh/__init__.py +7 -4
- scitex/social/__init__.py +155 -0
- scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/stats/_mcp/_handlers/__init__.py +31 -0
- scitex/stats/_mcp/_handlers/_corrections.py +113 -0
- scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
- scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
- scitex/stats/_mcp/_handlers/_format.py +94 -0
- scitex/stats/_mcp/_handlers/_normality.py +110 -0
- scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
- scitex/stats/_mcp/_handlers/_power.py +247 -0
- scitex/stats/_mcp/_handlers/_recommend.py +102 -0
- scitex/stats/_mcp/_handlers/_run_test.py +279 -0
- scitex/stats/_mcp/_handlers/_stars.py +48 -0
- scitex/stats/_mcp/handlers.py +19 -1171
- scitex/stats/auto/_stat_style.py +175 -0
- scitex/stats/auto/_style_definitions.py +411 -0
- scitex/stats/auto/_styles.py +22 -620
- scitex/stats/descriptive/__init__.py +11 -8
- scitex/stats/descriptive/_ci.py +39 -0
- scitex/stats/power/_power.py +15 -4
- scitex/str/__init__.py +2 -1
- scitex/str/_title_case.py +63 -0
- scitex/template/README.md +1 -1
- scitex/template/__init__.py +25 -10
- scitex/template/_code_templates.py +147 -0
- scitex/template/_mcp/handlers.py +81 -0
- scitex/template/_mcp/tool_schemas.py +55 -0
- scitex/template/_templates/__init__.py +51 -0
- scitex/template/_templates/audio.py +233 -0
- scitex/template/_templates/canvas.py +312 -0
- scitex/template/_templates/capture.py +268 -0
- scitex/template/_templates/config.py +43 -0
- scitex/template/_templates/diagram.py +294 -0
- scitex/template/_templates/io.py +107 -0
- scitex/template/_templates/module.py +53 -0
- scitex/template/_templates/plt.py +202 -0
- scitex/template/_templates/scholar.py +267 -0
- scitex/template/_templates/session.py +130 -0
- scitex/template/_templates/session_minimal.py +43 -0
- scitex/template/_templates/session_plot.py +67 -0
- scitex/template/_templates/session_stats.py +77 -0
- scitex/template/_templates/stats.py +323 -0
- scitex/template/_templates/writer.py +296 -0
- scitex/template/clone_writer_directory.py +5 -5
- scitex/ui/_backends/_email.py +10 -2
- scitex/ui/_backends/_webhook.py +5 -1
- scitex/web/_search_pubmed.py +10 -6
- scitex/writer/README.md +1 -1
- scitex/writer/__init__.py +43 -34
- scitex/writer/_mcp/handlers.py +11 -744
- scitex/writer/_mcp/tool_schemas.py +5 -335
- scitex-2.15.3.dist-info/METADATA +667 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/RECORD +241 -120
- scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
- scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
- scitex/diagram/_compile.py +0 -312
- scitex/diagram/_diagram.py +0 -355
- scitex/diagram/_mcp/__init__.py +0 -4
- scitex/diagram/_mcp/handlers.py +0 -400
- scitex/diagram/_mcp/tool_schemas.py +0 -157
- scitex/diagram/_presets.py +0 -173
- scitex/diagram/_schema.py +0 -182
- scitex/diagram/_split.py +0 -278
- scitex/gen/_ci.py +0 -12
- scitex/gen/_title_case.py +0 -89
- scitex/plt/_mcp/__init__.py +0 -4
- scitex/plt/_mcp/_handlers_annotation.py +0 -102
- scitex/plt/_mcp/_handlers_figure.py +0 -195
- scitex/plt/_mcp/_handlers_plot.py +0 -252
- scitex/plt/_mcp/_handlers_style.py +0 -219
- scitex/plt/_mcp/handlers.py +0 -74
- scitex/plt/_mcp/tool_schemas.py +0 -497
- scitex/plt/mcp_server.py +0 -231
- scitex/scholar/examples/SUGGESTIONS.md +0 -865
- scitex/scholar/examples/dev.py +0 -38
- scitex-2.14.0.dist-info/METADATA +0 -1238
- /scitex/{gen → context}/_detect_environment.py +0 -0
- /scitex/{gen → context}/_get_notebook_path.py +0 -0
- /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/WHEEL +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/entry_points.txt +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/licenses/LICENSE +0 -0
scitex/plt/mcp_server.py
DELETED
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# Timestamp: 2026-01-08
|
|
3
|
-
# File: src/scitex/plt/mcp_server.py
|
|
4
|
-
# ----------------------------------------
|
|
5
|
-
|
|
6
|
-
"""
|
|
7
|
-
MCP Server for SciTeX plt - Publication-quality plotting.
|
|
8
|
-
|
|
9
|
-
Provides tools for:
|
|
10
|
-
- Style configuration (get/set publication styles)
|
|
11
|
-
- Style presets (journal-specific configurations)
|
|
12
|
-
- Figure cropping (auto-crop whitespace)
|
|
13
|
-
- DPI management
|
|
14
|
-
- Color palette access
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import asyncio
|
|
20
|
-
|
|
21
|
-
# Graceful MCP dependency handling
|
|
22
|
-
try:
|
|
23
|
-
import mcp.types as types
|
|
24
|
-
from mcp.server import NotificationOptions, Server
|
|
25
|
-
from mcp.server.models import InitializationOptions
|
|
26
|
-
from mcp.server.stdio import stdio_server
|
|
27
|
-
|
|
28
|
-
MCP_AVAILABLE = True
|
|
29
|
-
except ImportError:
|
|
30
|
-
MCP_AVAILABLE = False
|
|
31
|
-
types = None # type: ignore
|
|
32
|
-
Server = None # type: ignore
|
|
33
|
-
NotificationOptions = None # type: ignore
|
|
34
|
-
InitializationOptions = None # type: ignore
|
|
35
|
-
stdio_server = None # type: ignore
|
|
36
|
-
|
|
37
|
-
__all__ = ["PltServer", "main", "MCP_AVAILABLE"]
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class PltServer:
|
|
41
|
-
"""MCP Server for Publication-quality Plotting."""
|
|
42
|
-
|
|
43
|
-
def __init__(self):
|
|
44
|
-
self.server = Server("scitex-plt")
|
|
45
|
-
self.setup_handlers()
|
|
46
|
-
|
|
47
|
-
def setup_handlers(self):
|
|
48
|
-
"""Set up MCP server handlers."""
|
|
49
|
-
from ._mcp.handlers import (
|
|
50
|
-
add_panel_label_handler,
|
|
51
|
-
add_significance_handler,
|
|
52
|
-
close_figure_handler,
|
|
53
|
-
create_figure_handler,
|
|
54
|
-
crop_figure_handler,
|
|
55
|
-
get_color_palette_handler,
|
|
56
|
-
get_dpi_settings_handler,
|
|
57
|
-
get_style_handler,
|
|
58
|
-
list_presets_handler,
|
|
59
|
-
plot_bar_handler,
|
|
60
|
-
plot_box_handler,
|
|
61
|
-
plot_line_handler,
|
|
62
|
-
plot_scatter_handler,
|
|
63
|
-
plot_violin_handler,
|
|
64
|
-
save_figure_handler,
|
|
65
|
-
set_style_handler,
|
|
66
|
-
)
|
|
67
|
-
from ._mcp.tool_schemas import get_tool_schemas
|
|
68
|
-
|
|
69
|
-
@self.server.list_tools()
|
|
70
|
-
async def handle_list_tools():
|
|
71
|
-
return get_tool_schemas()
|
|
72
|
-
|
|
73
|
-
@self.server.call_tool()
|
|
74
|
-
async def handle_call_tool(name: str, arguments: dict):
|
|
75
|
-
# Style tools
|
|
76
|
-
if name == "get_style":
|
|
77
|
-
return await self._wrap_result(get_style_handler())
|
|
78
|
-
elif name == "set_style":
|
|
79
|
-
return await self._wrap_result(set_style_handler(**arguments))
|
|
80
|
-
elif name == "list_presets":
|
|
81
|
-
return await self._wrap_result(list_presets_handler())
|
|
82
|
-
elif name == "crop_figure":
|
|
83
|
-
return await self._wrap_result(crop_figure_handler(**arguments))
|
|
84
|
-
elif name == "get_dpi_settings":
|
|
85
|
-
return await self._wrap_result(get_dpi_settings_handler())
|
|
86
|
-
elif name == "get_color_palette":
|
|
87
|
-
return await self._wrap_result(get_color_palette_handler(**arguments))
|
|
88
|
-
# Plotting tools
|
|
89
|
-
elif name == "create_figure":
|
|
90
|
-
return await self._wrap_result(create_figure_handler(**arguments))
|
|
91
|
-
elif name == "plot_bar":
|
|
92
|
-
return await self._wrap_result(plot_bar_handler(**arguments))
|
|
93
|
-
elif name == "plot_scatter":
|
|
94
|
-
return await self._wrap_result(plot_scatter_handler(**arguments))
|
|
95
|
-
elif name == "plot_line":
|
|
96
|
-
return await self._wrap_result(plot_line_handler(**arguments))
|
|
97
|
-
elif name == "plot_box":
|
|
98
|
-
return await self._wrap_result(plot_box_handler(**arguments))
|
|
99
|
-
elif name == "plot_violin":
|
|
100
|
-
return await self._wrap_result(plot_violin_handler(**arguments))
|
|
101
|
-
elif name == "add_significance":
|
|
102
|
-
return await self._wrap_result(add_significance_handler(**arguments))
|
|
103
|
-
elif name == "add_panel_label":
|
|
104
|
-
return await self._wrap_result(add_panel_label_handler(**arguments))
|
|
105
|
-
elif name == "save_figure":
|
|
106
|
-
return await self._wrap_result(save_figure_handler(**arguments))
|
|
107
|
-
elif name == "close_figure":
|
|
108
|
-
return await self._wrap_result(close_figure_handler(**arguments))
|
|
109
|
-
else:
|
|
110
|
-
raise ValueError(f"Unknown tool: {name}")
|
|
111
|
-
|
|
112
|
-
@self.server.list_resources()
|
|
113
|
-
async def handle_list_resources():
|
|
114
|
-
"""List available plt resources."""
|
|
115
|
-
resources = [
|
|
116
|
-
types.Resource(
|
|
117
|
-
uri="plt://style/current",
|
|
118
|
-
name="Current Style",
|
|
119
|
-
description="Current publication style configuration",
|
|
120
|
-
mimeType="application/json",
|
|
121
|
-
),
|
|
122
|
-
types.Resource(
|
|
123
|
-
uri="plt://presets",
|
|
124
|
-
name="Style Presets",
|
|
125
|
-
description="Available journal style presets",
|
|
126
|
-
mimeType="application/json",
|
|
127
|
-
),
|
|
128
|
-
types.Resource(
|
|
129
|
-
uri="plt://colors",
|
|
130
|
-
name="Color Palette",
|
|
131
|
-
description="SciTeX color palette",
|
|
132
|
-
mimeType="application/json",
|
|
133
|
-
),
|
|
134
|
-
]
|
|
135
|
-
return resources
|
|
136
|
-
|
|
137
|
-
@self.server.read_resource()
|
|
138
|
-
async def handle_read_resource(uri: str):
|
|
139
|
-
"""Read a plt resource."""
|
|
140
|
-
import json
|
|
141
|
-
|
|
142
|
-
if uri == "plt://style/current":
|
|
143
|
-
result = await get_style_handler()
|
|
144
|
-
return types.TextResourceContents(
|
|
145
|
-
uri=uri,
|
|
146
|
-
mimeType="application/json",
|
|
147
|
-
text=json.dumps(result, indent=2),
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
elif uri == "plt://presets":
|
|
151
|
-
result = await list_presets_handler()
|
|
152
|
-
return types.TextResourceContents(
|
|
153
|
-
uri=uri,
|
|
154
|
-
mimeType="application/json",
|
|
155
|
-
text=json.dumps(result, indent=2),
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
elif uri == "plt://colors":
|
|
159
|
-
result = await get_color_palette_handler()
|
|
160
|
-
return types.TextResourceContents(
|
|
161
|
-
uri=uri,
|
|
162
|
-
mimeType="application/json",
|
|
163
|
-
text=json.dumps(result, indent=2),
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
else:
|
|
167
|
-
raise ValueError(f"Unknown resource URI: {uri}")
|
|
168
|
-
|
|
169
|
-
async def _wrap_result(self, coro):
|
|
170
|
-
"""Wrap handler result as MCP TextContent."""
|
|
171
|
-
import json
|
|
172
|
-
|
|
173
|
-
try:
|
|
174
|
-
result = await coro
|
|
175
|
-
return [
|
|
176
|
-
types.TextContent(
|
|
177
|
-
type="text",
|
|
178
|
-
text=json.dumps(result, indent=2, default=str),
|
|
179
|
-
)
|
|
180
|
-
]
|
|
181
|
-
except Exception as e:
|
|
182
|
-
return [
|
|
183
|
-
types.TextContent(
|
|
184
|
-
type="text",
|
|
185
|
-
text=json.dumps({"success": False, "error": str(e)}, indent=2),
|
|
186
|
-
)
|
|
187
|
-
]
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
async def _run_server():
|
|
191
|
-
"""Run the MCP server (internal)."""
|
|
192
|
-
server = PltServer()
|
|
193
|
-
async with stdio_server() as (read_stream, write_stream):
|
|
194
|
-
await server.server.run(
|
|
195
|
-
read_stream,
|
|
196
|
-
write_stream,
|
|
197
|
-
InitializationOptions(
|
|
198
|
-
server_name="scitex-plt",
|
|
199
|
-
server_version="0.1.0",
|
|
200
|
-
capabilities=server.server.get_capabilities(
|
|
201
|
-
notification_options=NotificationOptions(),
|
|
202
|
-
experimental_capabilities={},
|
|
203
|
-
),
|
|
204
|
-
),
|
|
205
|
-
)
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
def main():
|
|
209
|
-
"""Main entry point for the MCP server."""
|
|
210
|
-
if not MCP_AVAILABLE:
|
|
211
|
-
import sys
|
|
212
|
-
|
|
213
|
-
print("=" * 60)
|
|
214
|
-
print("MCP Server 'scitex-plt' requires the 'mcp' package.")
|
|
215
|
-
print()
|
|
216
|
-
print("Install with:")
|
|
217
|
-
print(" pip install mcp")
|
|
218
|
-
print()
|
|
219
|
-
print("Or install scitex with MCP support:")
|
|
220
|
-
print(" pip install scitex[mcp]")
|
|
221
|
-
print("=" * 60)
|
|
222
|
-
sys.exit(1)
|
|
223
|
-
|
|
224
|
-
asyncio.run(_run_server())
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
if __name__ == "__main__":
|
|
228
|
-
main()
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
# EOF
|