scitex 2.15.2__py3-none-any.whl → 2.15.4__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.
Files changed (77) hide show
  1. scitex/_mcp_resources/__init__.py +2 -0
  2. scitex/_mcp_resources/_scholar.py +148 -0
  3. scitex/_mcp_tools/scholar.py +50 -99
  4. scitex/_mcp_tools/social.py +15 -232
  5. scitex/_mcp_tools/writer.py +7 -17
  6. scitex/canvas/mcp_server.py +16 -3
  7. scitex/capture/mcp_server.py +16 -2
  8. scitex/cli/audio.py +90 -20
  9. scitex/cli/capture.py +120 -0
  10. scitex/cli/introspect.py +19 -12
  11. scitex/cli/plt.py +78 -21
  12. scitex/cli/scholar/__init__.py +160 -2
  13. scitex/cli/scholar/_crossref_scitex.py +25 -266
  14. scitex/cli/scholar/_openalex_scitex.py +55 -0
  15. scitex/cli/social.py +63 -22
  16. scitex/cli/stats.py +121 -3
  17. scitex/cli/writer.py +49 -423
  18. scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +90 -0
  19. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +1571 -0
  20. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +6262 -0
  21. scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +1274 -0
  22. scitex/dev/plt/data/mpl/dir_ax.txt +459 -0
  23. scitex/introspect/_list_api.py +5 -2
  24. scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +2 -2
  25. scitex/scholar/__init__.py +14 -9
  26. scitex/scholar/_mcp/crossref_tool_schemas.py +133 -0
  27. scitex/scholar/_mcp/openalex_handlers.py +212 -0
  28. scitex/scholar/_mcp/openalex_tool_schemas.py +96 -0
  29. scitex/scholar/_mcp/tool_schemas.py +16 -1
  30. scitex/scholar/data/.gitkeep +0 -0
  31. scitex/scholar/data/README.md +44 -0
  32. scitex/scholar/data/bib_files/bibliography.bib +1952 -0
  33. scitex/scholar/data/bib_files/neurovista.bib +277 -0
  34. scitex/scholar/data/bib_files/neurovista_enriched.bib +441 -0
  35. scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +441 -0
  36. scitex/scholar/data/bib_files/neurovista_processed.bib +338 -0
  37. scitex/scholar/data/bib_files/openaccess.bib +89 -0
  38. scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +2178 -0
  39. scitex/scholar/data/bib_files/pac.bib +698 -0
  40. scitex/scholar/data/bib_files/pac_enriched.bib +1061 -0
  41. scitex/scholar/data/bib_files/pac_processed.bib +0 -0
  42. scitex/scholar/data/bib_files/pac_titles.txt +75 -0
  43. scitex/scholar/data/bib_files/paywalled.bib +98 -0
  44. scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +58 -0
  45. scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +87 -0
  46. scitex/scholar/data/bib_files/seizure_prediction.bib +694 -0
  47. scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
  48. scitex/scholar/data/bib_files/test_complete_enriched.bib +437 -0
  49. scitex/scholar/data/bib_files/test_final_enriched.bib +437 -0
  50. scitex/scholar/data/bib_files/test_seizure.bib +46 -0
  51. scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
  52. scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
  53. scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
  54. scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
  55. scitex/scholar/data/impact_factor.db +0 -0
  56. scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +2 -2
  57. scitex/scholar/local_dbs/__init__.py +31 -0
  58. scitex/scholar/local_dbs/crossref_scitex.py +30 -0
  59. scitex/scholar/local_dbs/openalex_scitex.py +30 -0
  60. scitex/scholar/mcp_server.py +59 -4
  61. scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +2 -2
  62. scitex/stats/mcp_server.py +16 -3
  63. scitex/template/mcp_server.py +16 -3
  64. scitex/ui/mcp_server.py +16 -3
  65. scitex/writer/__init__.py +43 -34
  66. {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/METADATA +22 -3
  67. {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/RECORD +70 -38
  68. scitex/scholar/crossref_scitex.py +0 -367
  69. scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +0 -462
  70. scitex/scholar/url_finder/.tmp/open_url/README.md +0 -223
  71. scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +0 -694
  72. scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +0 -1160
  73. scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +0 -344
  74. scitex/scholar/url_finder/.tmp/open_url/__init__.py +0 -24
  75. {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/WHEEL +0 -0
  76. {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/entry_points.txt +0 -0
  77. {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,459 @@
1
+ ArtistList
2
+ _AxesBase__clear
3
+ _PROPERTIES_EXCLUDED_FROM_SET
4
+ __annotations__
5
+ __class__
6
+ __delattr__
7
+ __dict__
8
+ __dir__
9
+ __doc__
10
+ __eq__
11
+ __format__
12
+ __ge__
13
+ __getattribute__
14
+ __getstate__
15
+ __gt__
16
+ __hash__
17
+ __init__
18
+ __init_subclass__
19
+ __le__
20
+ __lt__
21
+ __module__
22
+ __ne__
23
+ __new__
24
+ __reduce__
25
+ __reduce_ex__
26
+ __repr__
27
+ __setattr__
28
+ __setstate__
29
+ __sizeof__
30
+ __str__
31
+ __subclasshook__
32
+ __weakref__
33
+ _add_text
34
+ _adjustable
35
+ _agg_filter
36
+ _alias_map
37
+ _alpha
38
+ _anchor
39
+ _animated
40
+ _aspect
41
+ _autotitlepos
42
+ _axes
43
+ _axes_locator
44
+ _axis_map
45
+ _axis_names
46
+ _axisbelow
47
+ _box_aspect
48
+ _callbacks
49
+ _check_no_units
50
+ _children
51
+ _clipon
52
+ _clippath
53
+ _cm_set
54
+ _colorbars
55
+ _convert_dx
56
+ _current_image
57
+ _different_canvas
58
+ _errorevery_to_mask
59
+ _facecolor
60
+ _fill_between_process_units
61
+ _fill_between_x_or_y
62
+ _forward_navigation_events
63
+ _frameon
64
+ _fully_clipped_to_axes
65
+ _gci
66
+ _gen_axes_patch
67
+ _gen_axes_spines
68
+ _get_aspect_ratio
69
+ _get_lines
70
+ _get_pan_points
71
+ _get_patches_for_fill
72
+ _get_view
73
+ _gid
74
+ _gridOn
75
+ _in_layout
76
+ _init_axis
77
+ _internal_update
78
+ _label
79
+ _label_outer_xaxis
80
+ _label_outer_yaxis
81
+ _left_title
82
+ _make_twin_axes
83
+ _mouseover
84
+ _mouseover_set
85
+ _navigate
86
+ _navigate_mode
87
+ _originalPosition
88
+ _parent_figure
89
+ _parse_bar_color_args
90
+ _parse_scatter_color_args
91
+ _path_effects
92
+ _pcolorargs
93
+ _picker
94
+ _position
95
+ _prepare_view_from_bbox
96
+ _process_unit_info
97
+ _projection_init
98
+ _quiver_units
99
+ _rasterization_zorder
100
+ _rasterized
101
+ _remove_legend
102
+ _remove_method
103
+ _request_autoscale_view
104
+ _right_title
105
+ _sci
106
+ _set_alpha_for_array
107
+ _set_artist_props
108
+ _set_gc_clip
109
+ _set_lim_and_transforms
110
+ _set_position
111
+ _set_title_offset_trans
112
+ _set_view
113
+ _set_view_from_bbox
114
+ _shared_axes
115
+ _sharex
116
+ _sharey
117
+ _sketch
118
+ _snap
119
+ _stale
120
+ _stale_viewlims
121
+ _sticky_edges
122
+ _subclass_uses_cla
123
+ _subplotspec
124
+ _tight
125
+ _transform
126
+ _transformSet
127
+ _twinned_axes
128
+ _unit_change_handler
129
+ _unstale_viewLim
130
+ _update_image_limits
131
+ _update_line_limits
132
+ _update_patch_limits
133
+ _update_props
134
+ _update_set_signature_and_docstring
135
+ _update_title_position
136
+ _update_transScale
137
+ _url
138
+ _use_sticky_edges
139
+ _validate_converted_limits
140
+ _viewLim
141
+ _visible
142
+ _xaxis_transform
143
+ _xmargin
144
+ _yaxis_transform
145
+ _ymargin
146
+ acorr
147
+ add_artist
148
+ add_callback
149
+ add_child_axes
150
+ add_collection
151
+ add_container
152
+ add_image
153
+ add_line
154
+ add_patch
155
+ add_table
156
+ angle_spectrum
157
+ annotate
158
+ apply_aspect
159
+ arrow
160
+ artists
161
+ autoscale
162
+ autoscale_view
163
+ axes
164
+ axhline
165
+ axhspan
166
+ axis
167
+ axison
168
+ axline
169
+ axvline
170
+ axvspan
171
+ bar
172
+ bar_label
173
+ barbs
174
+ barh
175
+ bbox
176
+ boxplot
177
+ broken_barh
178
+ bxp
179
+ callbacks
180
+ can_pan
181
+ can_zoom
182
+ child_axes
183
+ cla
184
+ clabel
185
+ clear
186
+ clipbox
187
+ cohere
188
+ collections
189
+ containers
190
+ contains
191
+ contains_point
192
+ contour
193
+ contourf
194
+ convert_xunits
195
+ convert_yunits
196
+ csd
197
+ dataLim
198
+ drag_pan
199
+ draw
200
+ draw_artist
201
+ ecdf
202
+ end_pan
203
+ errorbar
204
+ eventplot
205
+ figure
206
+ fill
207
+ fill_between
208
+ fill_betweenx
209
+ findobj
210
+ fmt_xdata
211
+ fmt_ydata
212
+ format_coord
213
+ format_cursor_data
214
+ format_xdata
215
+ format_ydata
216
+ get_adjustable
217
+ get_agg_filter
218
+ get_alpha
219
+ get_anchor
220
+ get_animated
221
+ get_aspect
222
+ get_autoscale_on
223
+ get_autoscalex_on
224
+ get_autoscaley_on
225
+ get_axes_locator
226
+ get_axisbelow
227
+ get_box_aspect
228
+ get_children
229
+ get_clip_box
230
+ get_clip_on
231
+ get_clip_path
232
+ get_cursor_data
233
+ get_data_ratio
234
+ get_default_bbox_extra_artists
235
+ get_facecolor
236
+ get_fc
237
+ get_figure
238
+ get_forward_navigation_events
239
+ get_frame_on
240
+ get_gid
241
+ get_gridspec
242
+ get_images
243
+ get_in_layout
244
+ get_label
245
+ get_legend
246
+ get_legend_handles_labels
247
+ get_lines
248
+ get_mouseover
249
+ get_navigate
250
+ get_navigate_mode
251
+ get_path_effects
252
+ get_picker
253
+ get_position
254
+ get_rasterization_zorder
255
+ get_rasterized
256
+ get_shared_x_axes
257
+ get_shared_y_axes
258
+ get_sketch_params
259
+ get_snap
260
+ get_subplotspec
261
+ get_tightbbox
262
+ get_title
263
+ get_transform
264
+ get_transformed_clip_path_and_affine
265
+ get_url
266
+ get_visible
267
+ get_window_extent
268
+ get_xaxis
269
+ get_xaxis_text1_transform
270
+ get_xaxis_text2_transform
271
+ get_xaxis_transform
272
+ get_xbound
273
+ get_xgridlines
274
+ get_xlabel
275
+ get_xlim
276
+ get_xmajorticklabels
277
+ get_xmargin
278
+ get_xminorticklabels
279
+ get_xscale
280
+ get_xticklabels
281
+ get_xticklines
282
+ get_xticks
283
+ get_yaxis
284
+ get_yaxis_text1_transform
285
+ get_yaxis_text2_transform
286
+ get_yaxis_transform
287
+ get_ybound
288
+ get_ygridlines
289
+ get_ylabel
290
+ get_ylim
291
+ get_ymajorticklabels
292
+ get_ymargin
293
+ get_yminorticklabels
294
+ get_yscale
295
+ get_yticklabels
296
+ get_yticklines
297
+ get_yticks
298
+ get_zorder
299
+ grid
300
+ has_data
301
+ have_units
302
+ hexbin
303
+ hist
304
+ hist2d
305
+ hlines
306
+ ignore_existing_data_limits
307
+ images
308
+ imshow
309
+ in_axes
310
+ indicate_inset
311
+ indicate_inset_zoom
312
+ inset_axes
313
+ invert_xaxis
314
+ invert_yaxis
315
+ is_transform_set
316
+ label_outer
317
+ legend
318
+ legend_
319
+ lines
320
+ locator_params
321
+ loglog
322
+ magnitude_spectrum
323
+ margins
324
+ matshow
325
+ minorticks_off
326
+ minorticks_on
327
+ mouseover
328
+ name
329
+ patch
330
+ patches
331
+ pchanged
332
+ pcolor
333
+ pcolorfast
334
+ pcolormesh
335
+ phase_spectrum
336
+ pick
337
+ pickable
338
+ pie
339
+ plot
340
+ plot_date
341
+ properties
342
+ psd
343
+ quiver
344
+ quiverkey
345
+ redraw_in_frame
346
+ relim
347
+ remove
348
+ remove_callback
349
+ reset_position
350
+ scatter
351
+ secondary_xaxis
352
+ secondary_yaxis
353
+ semilogx
354
+ semilogy
355
+ set
356
+ set_adjustable
357
+ set_agg_filter
358
+ set_alpha
359
+ set_anchor
360
+ set_animated
361
+ set_aspect
362
+ set_autoscale_on
363
+ set_autoscalex_on
364
+ set_autoscaley_on
365
+ set_axes_locator
366
+ set_axis_off
367
+ set_axis_on
368
+ set_axisbelow
369
+ set_box_aspect
370
+ set_clip_box
371
+ set_clip_on
372
+ set_clip_path
373
+ set_facecolor
374
+ set_fc
375
+ set_figure
376
+ set_forward_navigation_events
377
+ set_frame_on
378
+ set_gid
379
+ set_in_layout
380
+ set_label
381
+ set_mouseover
382
+ set_navigate
383
+ set_navigate_mode
384
+ set_path_effects
385
+ set_picker
386
+ set_position
387
+ set_prop_cycle
388
+ set_rasterization_zorder
389
+ set_rasterized
390
+ set_sketch_params
391
+ set_snap
392
+ set_subplotspec
393
+ set_title
394
+ set_transform
395
+ set_url
396
+ set_visible
397
+ set_xbound
398
+ set_xlabel
399
+ set_xlim
400
+ set_xmargin
401
+ set_xscale
402
+ set_xticklabels
403
+ set_xticks
404
+ set_ybound
405
+ set_ylabel
406
+ set_ylim
407
+ set_ymargin
408
+ set_yscale
409
+ set_yticklabels
410
+ set_yticks
411
+ set_zorder
412
+ sharex
413
+ sharey
414
+ specgram
415
+ spines
416
+ spy
417
+ stackplot
418
+ stairs
419
+ stale
420
+ stale_callback
421
+ start_pan
422
+ stem
423
+ step
424
+ sticky_edges
425
+ streamplot
426
+ table
427
+ tables
428
+ text
429
+ texts
430
+ tick_params
431
+ ticklabel_format
432
+ title
433
+ titleOffsetTrans
434
+ transAxes
435
+ transData
436
+ transLimits
437
+ transScale
438
+ tricontour
439
+ tricontourf
440
+ tripcolor
441
+ triplot
442
+ twinx
443
+ twiny
444
+ update
445
+ update_datalim
446
+ update_from
447
+ use_sticky_edges
448
+ viewLim
449
+ violin
450
+ violinplot
451
+ vlines
452
+ xaxis
453
+ xaxis_date
454
+ xaxis_inverted
455
+ xcorr
456
+ yaxis
457
+ yaxis_date
458
+ yaxis_inverted
459
+ zorder
@@ -4,6 +4,7 @@
4
4
 
5
5
  """Module API listing utilities."""
6
6
 
7
+ import importlib
7
8
  import inspect
8
9
  import sys
9
10
  import warnings
@@ -108,10 +109,12 @@ def _list_api_impl(
108
109
  warnings.filterwarnings("ignore", category=UserWarning)
109
110
 
110
111
  if isinstance(module, str):
112
+ # Normalize hyphens to underscores for Python module names
113
+ module_name = module.replace("-", "_")
111
114
  try:
112
- module = __import__(module)
115
+ module = importlib.import_module(module_name)
113
116
  except ImportError as err:
114
- print(f"Error importing module {module}: {err}")
117
+ print(f"Error importing module {module_name}: {err}")
115
118
  return pd.DataFrame(columns=columns)
116
119
 
117
120
  if visited is None:
@@ -115,7 +115,7 @@ from figrecipe import *
115
115
 
116
116
  ## Port Scheme
117
117
 
118
- SciTeX uses port scheme 3129X (sa-i-te-ku-su → 3-1-2-9 in Japanese):
118
+ SciTeX uses port scheme 3129X (TEX → te-ku-su → 2-9-3 in Japanese):
119
119
 
120
120
  | Port | Service |
121
121
  |-------|------------------|
@@ -130,7 +130,7 @@ External packages should use `{ENV_PREFIX}_{SETTING}`:
130
130
 
131
131
  ```
132
132
  SCITEX_PLT_MODE=local
133
- CROSSREF_LOCAL_API_URL=http://localhost:31291
133
+ CROSSREF_LOCAL_API_URL=http://localhost:8333
134
134
  SCITEX_AUDIO_RELAY_URL=http://localhost:31293
135
135
  ```
136
136
 
@@ -1,5 +1,4 @@
1
- """
2
- SciTeX Scholar - Scientific Literature Management Made Simple
1
+ """SciTeX Scholar - Scientific Literature Management Made Simple.
3
2
 
4
3
  This module provides a unified interface for:
5
4
  - Searching scientific literature across multiple sources
@@ -27,17 +26,17 @@ _missing = warn_module_deps("scholar")
27
26
  try:
28
27
  from scitex.scholar.auth import ScholarAuthManager
29
28
  except ImportError:
30
- ScholarAuthManager = None
29
+ ScholarAuthManager = None # type: ignore[misc,assignment]
31
30
 
32
31
  try:
33
32
  from scitex.scholar.browser import ScholarBrowserManager
34
33
  except ImportError:
35
- ScholarBrowserManager = None
34
+ ScholarBrowserManager = None # type: ignore[misc,assignment]
36
35
 
37
36
  try:
38
37
  from scitex.scholar.config import ScholarConfig
39
38
  except ImportError:
40
- ScholarConfig = None
39
+ ScholarConfig = None # type: ignore[misc,assignment]
41
40
 
42
41
  try:
43
42
  from scitex.scholar.core import Paper, Papers, Scholar
@@ -71,12 +70,17 @@ try:
71
70
  except ImportError:
72
71
  utils = None
73
72
 
74
- # CrossRef integration via crossref-local delegation (branded as crossref-scitex)
73
+ # Local database integrations (crossref-local, openalex-local)
75
74
  try:
76
- from . import crossref_scitex
75
+ from .local_dbs import crossref_scitex
77
76
  except ImportError:
78
77
  crossref_scitex = None
79
78
 
79
+ try:
80
+ from .local_dbs import openalex_scitex
81
+ except ImportError:
82
+ openalex_scitex = None
83
+
80
84
  __all__ = [
81
85
  "ScholarConfig",
82
86
  "ScholarEngine",
@@ -87,8 +91,9 @@ __all__ = [
87
91
  "Papers",
88
92
  "Scholar",
89
93
  "utils",
90
- # CrossRef integration (167M+ papers via crossref-local)
91
- "crossref_scitex",
94
+ # Local database integrations
95
+ "crossref_scitex", # CrossRef (167M+ papers via crossref-local)
96
+ "openalex_scitex", # OpenAlex (284M+ works via openalex-local)
92
97
  ]
93
98
 
94
99
  # # Import core classes for advanced users
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: 2026-01-29
3
+ # File: src/scitex/scholar/_mcp/crossref_tool_schemas.py
4
+ """CrossRef-Local tool schemas for MCP server.
5
+
6
+ Provides access to 167M+ papers via crossref-local database.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import mcp.types as types
12
+
13
+ __all__ = ["get_crossref_tool_schemas"]
14
+
15
+
16
+ def get_crossref_tool_schemas() -> list[types.Tool]:
17
+ """Return CrossRef-Local tool schemas."""
18
+ return [
19
+ types.Tool(
20
+ name="crossref_search",
21
+ description=(
22
+ "Search CrossRef database (167M+ papers) via crossref-local. "
23
+ "Fast full-text search with year filtering and citation enrichment."
24
+ ),
25
+ inputSchema={
26
+ "type": "object",
27
+ "properties": {
28
+ "query": {
29
+ "type": "string",
30
+ "description": "Search query string (full-text search)",
31
+ },
32
+ "limit": {
33
+ "type": "integer",
34
+ "description": "Maximum number of results",
35
+ "default": 20,
36
+ },
37
+ "offset": {
38
+ "type": "integer",
39
+ "description": "Number of results to skip for pagination",
40
+ "default": 0,
41
+ },
42
+ "year_min": {
43
+ "type": "integer",
44
+ "description": "Minimum publication year filter",
45
+ },
46
+ "year_max": {
47
+ "type": "integer",
48
+ "description": "Maximum publication year filter",
49
+ },
50
+ "enrich": {
51
+ "type": "boolean",
52
+ "description": "Add citation counts and references",
53
+ "default": False,
54
+ },
55
+ },
56
+ "required": ["query"],
57
+ },
58
+ ),
59
+ types.Tool(
60
+ name="crossref_get",
61
+ description="Get a paper by DOI from CrossRef database with optional citation data.",
62
+ inputSchema={
63
+ "type": "object",
64
+ "properties": {
65
+ "doi": {
66
+ "type": "string",
67
+ "description": "DOI of the paper (e.g., '10.1038/nature12373')",
68
+ },
69
+ "include_citations": {
70
+ "type": "boolean",
71
+ "description": "Include list of DOIs that cite this paper",
72
+ "default": False,
73
+ },
74
+ "include_references": {
75
+ "type": "boolean",
76
+ "description": "Include list of DOIs this paper references",
77
+ "default": False,
78
+ },
79
+ },
80
+ "required": ["doi"],
81
+ },
82
+ ),
83
+ types.Tool(
84
+ name="crossref_count",
85
+ description="Count papers matching a search query in CrossRef database.",
86
+ inputSchema={
87
+ "type": "object",
88
+ "properties": {
89
+ "query": {
90
+ "type": "string",
91
+ "description": "Search query string",
92
+ },
93
+ },
94
+ "required": ["query"],
95
+ },
96
+ ),
97
+ types.Tool(
98
+ name="crossref_citations",
99
+ description="Get citation relationships for a paper (citing papers and/or references).",
100
+ inputSchema={
101
+ "type": "object",
102
+ "properties": {
103
+ "doi": {
104
+ "type": "string",
105
+ "description": "DOI of the paper",
106
+ },
107
+ "direction": {
108
+ "type": "string",
109
+ "description": "Citation direction: 'citing', 'cited', or 'both'",
110
+ "enum": ["citing", "cited", "both"],
111
+ "default": "citing",
112
+ },
113
+ "limit": {
114
+ "type": "integer",
115
+ "description": "Maximum results per direction",
116
+ "default": 100,
117
+ },
118
+ },
119
+ "required": ["doi"],
120
+ },
121
+ ),
122
+ types.Tool(
123
+ name="crossref_info",
124
+ description="Get CrossRef database configuration and status.",
125
+ inputSchema={
126
+ "type": "object",
127
+ "properties": {},
128
+ },
129
+ ),
130
+ ]
131
+
132
+
133
+ # EOF