mcp-query-table 0.3.2__py3-none-any.whl → 0.3.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.
- mcp_query_table/__init__.py +2 -1
- mcp_query_table/_version.py +1 -1
- mcp_query_table/enums.py +1 -0
- mcp_query_table/providers/baidu.py +21 -1
- mcp_query_table/providers/n.py +34 -4
- mcp_query_table/providers/yuanbao.py +19 -1
- mcp_query_table/server.py +5 -4
- mcp_query_table/tool.py +36 -4
- {mcp_query_table-0.3.2.dist-info → mcp_query_table-0.3.4.dist-info}/METADATA +7 -4
- mcp_query_table-0.3.4.dist-info/RECORD +19 -0
- mcp_query_table-0.3.2.dist-info/RECORD +0 -19
- {mcp_query_table-0.3.2.dist-info → mcp_query_table-0.3.4.dist-info}/WHEEL +0 -0
- {mcp_query_table-0.3.2.dist-info → mcp_query_table-0.3.4.dist-info}/licenses/LICENSE +0 -0
- {mcp_query_table-0.3.2.dist-info → mcp_query_table-0.3.4.dist-info}/top_level.txt +0 -0
mcp_query_table/__init__.py
CHANGED
|
@@ -3,4 +3,5 @@ from ._version import __version__
|
|
|
3
3
|
from .enums import QueryType, Site, Provider
|
|
4
4
|
from .tool import BrowserManager, query, chat
|
|
5
5
|
|
|
6
|
-
TIMEOUT = 1000 * 60 *
|
|
6
|
+
TIMEOUT = 1000 * 60 * 3 # 3分钟,在抓取EventStream数据时等待数据返回,防止外层30秒超时
|
|
7
|
+
TIMEOUT_60 = 1000 * 60 # 1分钟
|
mcp_query_table/_version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.3.
|
|
1
|
+
__version__ = "0.3.4"
|
mcp_query_table/enums.py
CHANGED
|
@@ -8,10 +8,11 @@ import json
|
|
|
8
8
|
from playwright.async_api import Page
|
|
9
9
|
|
|
10
10
|
import mcp_query_table
|
|
11
|
-
from mcp_query_table.tool import GlobalVars
|
|
11
|
+
from mcp_query_table.tool import GlobalVars, split_images
|
|
12
12
|
|
|
13
13
|
_PAGE0_ = "https://chat.baidu.com/search"
|
|
14
14
|
_PAGE1_ = "https://chat.baidu.com/aichat/api/conversation"
|
|
15
|
+
_PAGE2_ = "https://chat.baidu.com/aichat/api/file/upload"
|
|
15
16
|
|
|
16
17
|
G = GlobalVars()
|
|
17
18
|
|
|
@@ -66,13 +67,32 @@ async def on_route(route):
|
|
|
66
67
|
async def chat(page: Page,
|
|
67
68
|
prompt: str,
|
|
68
69
|
create: bool,
|
|
70
|
+
files: list[str],
|
|
69
71
|
) -> str:
|
|
72
|
+
async def on_file_chooser(file_chooser):
|
|
73
|
+
# 文件选择对话框
|
|
74
|
+
await file_chooser.set_files(files)
|
|
75
|
+
|
|
70
76
|
if not page.url.startswith(_PAGE0_):
|
|
71
77
|
create = True
|
|
72
78
|
|
|
73
79
|
if create:
|
|
74
80
|
await page.goto(_PAGE0_)
|
|
75
81
|
|
|
82
|
+
# 文件上传
|
|
83
|
+
if len(files) > 0:
|
|
84
|
+
imgs, docs = split_images(files)
|
|
85
|
+
assert len(imgs) == 0 or len(docs) == 0, "不能同时包含图片和文档"
|
|
86
|
+
|
|
87
|
+
page.on("filechooser", on_file_chooser)
|
|
88
|
+
async with page.expect_response(f"{_PAGE2_}*", timeout=mcp_query_table.TIMEOUT_60) as response_info:
|
|
89
|
+
if len(imgs) > 0:
|
|
90
|
+
await page.locator(".cs-input-upload-icon").last.click()
|
|
91
|
+
else:
|
|
92
|
+
await page.locator(".cs-input-upload-icon").first.click()
|
|
93
|
+
page.remove_listener("filechooser", on_file_chooser)
|
|
94
|
+
|
|
95
|
+
# 提交问题
|
|
76
96
|
await page.route(_PAGE1_, on_route)
|
|
77
97
|
async with page.expect_response(_PAGE1_, timeout=mcp_query_table.TIMEOUT) as response_info:
|
|
78
98
|
await page.locator("#chat-input-box").fill(prompt)
|
mcp_query_table/providers/n.py
CHANGED
|
@@ -6,11 +6,12 @@ import json
|
|
|
6
6
|
from playwright.async_api import Page
|
|
7
7
|
|
|
8
8
|
import mcp_query_table
|
|
9
|
-
from mcp_query_table.tool import GlobalVars
|
|
9
|
+
from mcp_query_table.tool import GlobalVars, is_image
|
|
10
10
|
|
|
11
11
|
_PAGE0_ = "https://www.n.cn"
|
|
12
12
|
_PAGE1_ = "https://www.n.cn/search"
|
|
13
|
-
_PAGE2_ = "https://www.n.cn/api/common/chat/v2"
|
|
13
|
+
_PAGE2_ = "https://www.n.cn/api/common/chat/v2" # 对话
|
|
14
|
+
_PAGE3_ = "https://www.n.cn/api/image/upload" # 上传图片
|
|
14
15
|
|
|
15
16
|
G = GlobalVars()
|
|
16
17
|
|
|
@@ -48,7 +49,7 @@ def read_event_stream(text):
|
|
|
48
49
|
|
|
49
50
|
|
|
50
51
|
async def on_response(response):
|
|
51
|
-
if response == _PAGE2_:
|
|
52
|
+
if response.url == _PAGE2_:
|
|
52
53
|
# print("on_response", response.url)
|
|
53
54
|
text = await response.text()
|
|
54
55
|
G.set_text(read_event_stream(text))
|
|
@@ -57,14 +58,43 @@ async def on_response(response):
|
|
|
57
58
|
async def chat(page: Page,
|
|
58
59
|
prompt: str,
|
|
59
60
|
create: bool,
|
|
61
|
+
files: list[str],
|
|
60
62
|
) -> str:
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
Parameters
|
|
66
|
+
----------
|
|
67
|
+
page : playwright.async_api.Page
|
|
68
|
+
页面
|
|
69
|
+
prompt : str
|
|
70
|
+
问题
|
|
71
|
+
create : bool
|
|
72
|
+
是否创建新的对话
|
|
73
|
+
files : list[str] | None
|
|
74
|
+
上传的文件列表。目前仅支持上传图片
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
str
|
|
79
|
+
回答
|
|
80
|
+
"""
|
|
61
81
|
if not create:
|
|
62
82
|
if not page.url.startswith(_PAGE1_):
|
|
63
83
|
create = True
|
|
84
|
+
if len(files) > 0:
|
|
85
|
+
create = True
|
|
86
|
+
|
|
87
|
+
for file in files:
|
|
88
|
+
assert is_image(file), f"仅支持上传图片,{file}不是图片"
|
|
64
89
|
|
|
65
90
|
if create:
|
|
66
|
-
await page.goto(_PAGE0_)
|
|
67
91
|
name = "输入任何问题"
|
|
92
|
+
|
|
93
|
+
await page.goto(_PAGE0_)
|
|
94
|
+
if len(files) > 0:
|
|
95
|
+
# 只能在新会话中上传文件
|
|
96
|
+
async with page.expect_response(_PAGE3_, timeout=mcp_query_table.TIMEOUT_60) as response_info:
|
|
97
|
+
await page.locator("input[type=\"file\"]").set_input_files(files)
|
|
68
98
|
else:
|
|
69
99
|
name = "提出后续问题,Enter发送,Shift+Enter 换行"
|
|
70
100
|
|
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
腾讯元宝
|
|
3
3
|
"""
|
|
4
4
|
import json
|
|
5
|
+
import re
|
|
5
6
|
|
|
6
7
|
from playwright.async_api import Page
|
|
7
8
|
|
|
8
9
|
import mcp_query_table
|
|
9
|
-
from mcp_query_table.tool import GlobalVars
|
|
10
|
+
from mcp_query_table.tool import GlobalVars, split_images
|
|
10
11
|
|
|
11
12
|
_PAGE0_ = "https://yuanbao.tencent.com/"
|
|
12
13
|
_PAGE1_ = "https://yuanbao.tencent.com/api/chat"
|
|
14
|
+
_PAGE2_ = "https://yuanbao.tencent.com/api/resource/genUploadInfo"
|
|
13
15
|
|
|
14
16
|
G = GlobalVars()
|
|
15
17
|
|
|
@@ -65,6 +67,7 @@ async def on_route(route):
|
|
|
65
67
|
async def chat(page: Page,
|
|
66
68
|
prompt: str,
|
|
67
69
|
create: bool,
|
|
70
|
+
files: list[str]
|
|
68
71
|
) -> str:
|
|
69
72
|
if not page.url.startswith(_PAGE0_):
|
|
70
73
|
create = True
|
|
@@ -72,6 +75,21 @@ async def chat(page: Page,
|
|
|
72
75
|
if create:
|
|
73
76
|
await page.goto(_PAGE0_)
|
|
74
77
|
|
|
78
|
+
if len(files) > 0:
|
|
79
|
+
imgs, docs = split_images(files)
|
|
80
|
+
assert len(imgs) == 0 or len(docs) == 0, "不能同时包含图片和文档"
|
|
81
|
+
|
|
82
|
+
# 点击上传文件按钮,才会出现上传文件的input
|
|
83
|
+
await page.get_by_role("button").filter(has_text=re.compile(r"^$")).last.click()
|
|
84
|
+
|
|
85
|
+
# 上传文件
|
|
86
|
+
async with page.expect_response(_PAGE2_, timeout=mcp_query_table.TIMEOUT_60) as response_info:
|
|
87
|
+
if len(imgs) > 0:
|
|
88
|
+
await page.locator("input[type=\"file\"]").nth(-2).set_input_files(files)
|
|
89
|
+
else:
|
|
90
|
+
await page.locator("input[type=\"file\"]").last.set_input_files(files)
|
|
91
|
+
|
|
92
|
+
# 提问
|
|
75
93
|
await page.route(f"{_PAGE1_}/*", on_route)
|
|
76
94
|
async with page.expect_response(f"{_PAGE1_}/*", timeout=mcp_query_table.TIMEOUT) as response_info:
|
|
77
95
|
textbox = page.locator(".ql-editor")
|
mcp_query_table/server.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Annotated, Optional
|
|
1
|
+
from typing import Annotated, Optional, List
|
|
2
2
|
|
|
3
3
|
from loguru import logger
|
|
4
4
|
from mcp.server.fastmcp import FastMCP
|
|
@@ -29,9 +29,9 @@ class QueryServer:
|
|
|
29
29
|
if self.format == 'json':
|
|
30
30
|
return df.to_json(force_ascii=False, indent=2)
|
|
31
31
|
|
|
32
|
-
async def chat(self, prompt: str, create: bool, provider: Provider):
|
|
32
|
+
async def chat(self, prompt: str, create: bool, files: List[str], provider: Provider):
|
|
33
33
|
page = await self.browser.get_page()
|
|
34
|
-
txt = await qt_chat(page, prompt, create, provider)
|
|
34
|
+
txt = await qt_chat(page, prompt, create, files, provider)
|
|
35
35
|
self.browser.release_page(page)
|
|
36
36
|
return txt
|
|
37
37
|
|
|
@@ -57,10 +57,11 @@ async def query(
|
|
|
57
57
|
async def chat(
|
|
58
58
|
prompt: Annotated[str, Field(description="提示词。如:`9.9大还是9.11大?`")],
|
|
59
59
|
create: Annotated[bool, Field(default=False, description="是否创建新对话")],
|
|
60
|
+
files: Annotated[List[str], Field(default=None, description="上传的文件列表。不同网站支持程度不同")],
|
|
60
61
|
provider: Annotated[
|
|
61
62
|
Provider, Field(default=Provider.Nami, description="提供商。支持`纳米搜索`、`腾讯元宝`、`百度AI搜索`")]
|
|
62
63
|
) -> str:
|
|
63
|
-
return await qsv.chat(prompt, create, provider)
|
|
64
|
+
return await qsv.chat(prompt, create, files, provider)
|
|
64
65
|
|
|
65
66
|
|
|
66
67
|
def serve(format, cdp_endpoint, executable_path, transport, host, port):
|
mcp_query_table/tool.py
CHANGED
|
@@ -2,7 +2,7 @@ import subprocess
|
|
|
2
2
|
import sys
|
|
3
3
|
import time
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Optional
|
|
5
|
+
from typing import Optional, List, Tuple
|
|
6
6
|
|
|
7
7
|
import pandas as pd
|
|
8
8
|
from loguru import logger
|
|
@@ -142,6 +142,12 @@ class BrowserManager:
|
|
|
142
142
|
# 防止开发者工具被使用
|
|
143
143
|
if page.url.startswith("devtools://"):
|
|
144
144
|
continue
|
|
145
|
+
# 防止chrome扩展被使用
|
|
146
|
+
if page.url.startswith("chrome-extension://"):
|
|
147
|
+
continue
|
|
148
|
+
# 防止edge扩展被使用
|
|
149
|
+
if page.url.startswith("extension://"):
|
|
150
|
+
continue
|
|
145
151
|
self.pages.append(page)
|
|
146
152
|
|
|
147
153
|
async def _try_launch(self) -> None:
|
|
@@ -230,6 +236,7 @@ async def chat(
|
|
|
230
236
|
page: Page,
|
|
231
237
|
prompt: str = "9.9大还是9.11大?",
|
|
232
238
|
create: bool = False,
|
|
239
|
+
files: list[str] | None = None,
|
|
233
240
|
provider: Provider = Provider.Nami) -> str:
|
|
234
241
|
"""大语言对话
|
|
235
242
|
|
|
@@ -241,6 +248,8 @@ async def chat(
|
|
|
241
248
|
对话内容, by default "9.9大还是9.11大?"
|
|
242
249
|
create : bool, optional
|
|
243
250
|
是否创建新对话, by default False
|
|
251
|
+
files : list[str] | None, optional
|
|
252
|
+
上传的文件列表。不同网站支持程度不同
|
|
244
253
|
provider : Provider, optional
|
|
245
254
|
提供商, by default Provider.N
|
|
246
255
|
|
|
@@ -250,14 +259,37 @@ async def chat(
|
|
|
250
259
|
对话结果
|
|
251
260
|
|
|
252
261
|
"""
|
|
262
|
+
# 空列表转None
|
|
263
|
+
if files is None:
|
|
264
|
+
files = []
|
|
265
|
+
|
|
253
266
|
if provider == Provider.Nami:
|
|
254
267
|
from mcp_query_table.providers.n import chat
|
|
255
|
-
return await chat(page, prompt, create)
|
|
268
|
+
return await chat(page, prompt, create, files)
|
|
256
269
|
if provider == Provider.YuanBao:
|
|
257
270
|
from mcp_query_table.providers.yuanbao import chat
|
|
258
|
-
return await chat(page, prompt, create)
|
|
271
|
+
return await chat(page, prompt, create, files)
|
|
259
272
|
if provider == Provider.BaiDu:
|
|
260
273
|
from mcp_query_table.providers.baidu import chat
|
|
261
|
-
return await chat(page, prompt, create)
|
|
274
|
+
return await chat(page, prompt, create, files)
|
|
262
275
|
|
|
263
276
|
raise ValueError(f"未支持的提供商:{provider}")
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def is_image(path: str) -> bool:
|
|
280
|
+
"""判断是否是图片文件"""
|
|
281
|
+
img_ext = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp']
|
|
282
|
+
ext = Path(path).suffix.lower()
|
|
283
|
+
return ext in img_ext
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def split_images(files: List[str]) -> Tuple[List[str], List[str]]:
|
|
287
|
+
"""图片列表分成两部分"""
|
|
288
|
+
imgs = []
|
|
289
|
+
docs = []
|
|
290
|
+
for f in files:
|
|
291
|
+
if is_image(f):
|
|
292
|
+
imgs.append(f)
|
|
293
|
+
else:
|
|
294
|
+
docs.append(f)
|
|
295
|
+
return imgs, docs
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp_query_table
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: query table from website, support MCP
|
|
5
5
|
Author-email: wukan <wu-kan@163.com>
|
|
6
6
|
License: MIT License
|
|
@@ -132,7 +132,8 @@ if __name__ == '__main__':
|
|
|
132
132
|
|
|
133
133
|
确保可以在控制台中执行`python -m mcp_query_table -h`。如果不能,可能要先`pip install mcp_query_table`
|
|
134
134
|
|
|
135
|
-
在`Cline`中可以配置如下。其中`command`是`python`的绝对路径,`executable_path`是`Chrome
|
|
135
|
+
在`Cline`中可以配置如下。其中`command`是`python`的绝对路径,`executable_path`是`Chrome`的绝对路径,`timeout`是超时时间,单位为秒。
|
|
136
|
+
在各`AI`平台中由于返回时间常需1分钟以上,所以需要设置大的超时时间。
|
|
136
137
|
|
|
137
138
|
### STDIO方式
|
|
138
139
|
|
|
@@ -140,6 +141,7 @@ if __name__ == '__main__':
|
|
|
140
141
|
{
|
|
141
142
|
"mcpServers": {
|
|
142
143
|
"mcp_query_table": {
|
|
144
|
+
"timeout": 300,
|
|
143
145
|
"command": "D:\\Users\\Kan\\miniconda3\\envs\\py312\\python.exe",
|
|
144
146
|
"args": [
|
|
145
147
|
"-m",
|
|
@@ -170,6 +172,7 @@ python -m mcp_query_table --format markdown --transport sse --port 8000
|
|
|
170
172
|
{
|
|
171
173
|
"mcpServers": {
|
|
172
174
|
"mcp_query_table": {
|
|
175
|
+
"timeout": 300,
|
|
173
176
|
"url": "http://127.0.0.1:8000/sse"
|
|
174
177
|
}
|
|
175
178
|
}
|
|
@@ -182,8 +185,8 @@ python -m mcp_query_table --format markdown --transport sse --port 8000
|
|
|
182
185
|
npx @modelcontextprotocol/inspector python -m mcp_query_table --format markdown
|
|
183
186
|
```
|
|
184
187
|
|
|
185
|
-
打开浏览器并翻页是一个比较耗时的操作,会导致`MCP Inspector`页面超时,可以`http://localhost:5173/?timeout=
|
|
186
|
-
表示超时时间为
|
|
188
|
+
打开浏览器并翻页是一个比较耗时的操作,会导致`MCP Inspector`页面超时,可以`http://localhost:5173/?timeout=300000`
|
|
189
|
+
表示超时时间为300秒
|
|
187
190
|
|
|
188
191
|
第一次尝试编写`MCP`项目,可能会有各种问题,欢迎大家交流。
|
|
189
192
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
mcp_query_table/__init__.py,sha256=NmnAOKcJjQoeTJMbIY79-JsNNdj-PJpnZ-x8MPjpE4o,272
|
|
2
|
+
mcp_query_table/__main__.py,sha256=W3tMnZZTvkhjlLHmSYHng3CTvYX6-LjyaBDhf-ypH7w,1186
|
|
3
|
+
mcp_query_table/_version.py,sha256=oYLGMpySamd16KLiaBTfRyrAS7_oyp-TOEHmzmeumwg,22
|
|
4
|
+
mcp_query_table/enums.py,sha256=Hen0X1f2of69f08epun6HvYIgbpw_rf8BvoRQ184kS4,679
|
|
5
|
+
mcp_query_table/server.py,sha256=oV8CSi-EW5-xlPn38R1wLu7U-pCHgAJci1W8rJFsXSk,3430
|
|
6
|
+
mcp_query_table/tool.py,sha256=kCnfBNv1T88gNnFLsz-ZjXNuxbzhGvLPcPfNkkJ7Dyg,9096
|
|
7
|
+
mcp_query_table/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
+
mcp_query_table/providers/baidu.py,sha256=q0vZxl_UTO8v4LbznwT2b1hM-00jswDR8CqB3tc-X9U,3389
|
|
9
|
+
mcp_query_table/providers/n.py,sha256=J0Xo-BlXveIQdDbwKkuEP4I1mfAr8i1rviD0UTztI9Y,3009
|
|
10
|
+
mcp_query_table/providers/yuanbao.py,sha256=4DzoLfgg7dSP1BhiS_tKyTQ0byc1zHRuZQjyq-2pZfQ,3148
|
|
11
|
+
mcp_query_table/sites/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
+
mcp_query_table/sites/eastmoney.py,sha256=LImjpYVuM5YnXwnNzB2hkKfHofocZZScetGqMOCHZpk,4477
|
|
13
|
+
mcp_query_table/sites/iwencai.py,sha256=g56pj3pbxu4mXLNnaaS3Hdx-DvEy_9OBrQJe26z4z08,5059
|
|
14
|
+
mcp_query_table/sites/tdx.py,sha256=RIUQaB7Tn4AVyWaevk9SzTKIDwVO2f9erIlI-adXPLY,4126
|
|
15
|
+
mcp_query_table-0.3.4.dist-info/licenses/LICENSE,sha256=rbvv_CTd7biGwT21tvhgQ2zkbPFXOoON7WFQWEdElBA,1063
|
|
16
|
+
mcp_query_table-0.3.4.dist-info/METADATA,sha256=gc0VlBZxpcc_uPxkRA0WXdYNQ0cJeP3K5oTRKx5_4VU,8372
|
|
17
|
+
mcp_query_table-0.3.4.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
|
18
|
+
mcp_query_table-0.3.4.dist-info/top_level.txt,sha256=5M_8dkO1USOX7_EWbWS6O_TEsZ5yo-AodFNKeUEgvEQ,16
|
|
19
|
+
mcp_query_table-0.3.4.dist-info/RECORD,,
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
mcp_query_table/__init__.py,sha256=gNXLL6MtH667HEdsUbJ4OAbGqwYO1dLdkqorV3-RtLM,238
|
|
2
|
-
mcp_query_table/__main__.py,sha256=W3tMnZZTvkhjlLHmSYHng3CTvYX6-LjyaBDhf-ypH7w,1186
|
|
3
|
-
mcp_query_table/_version.py,sha256=vNiWJ14r_cw5t_7UDqDQIVZvladKFGyHH2avsLpN7Vg,22
|
|
4
|
-
mcp_query_table/enums.py,sha256=l-6uuGyniMVJGNh4tx9ZtktIjKSqyoHBHCJAdaOvczY,628
|
|
5
|
-
mcp_query_table/server.py,sha256=l8tt-1UNjTc5A8r3jGPt5REyCzU7N1t9_ndNJmThJ9k,3264
|
|
6
|
-
mcp_query_table/tool.py,sha256=X-mopuv0QRiQ2J_VLDcVWkH8ynXVTPgl6vlaYnDKnWA,8143
|
|
7
|
-
mcp_query_table/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
-
mcp_query_table/providers/baidu.py,sha256=N7D2mWzVfNJ2dbAMbdHisoBdac17-joyeF7BkFhLKPQ,2560
|
|
9
|
-
mcp_query_table/providers/n.py,sha256=H8hXgai8GDj3KizS2du4ix28PZlDaD6BkoyaheJnYd4,2152
|
|
10
|
-
mcp_query_table/providers/yuanbao.py,sha256=eTcOeV1ERFq7x5EgThBe9zsSodriGy7-eIWJRqcgwYU,2350
|
|
11
|
-
mcp_query_table/sites/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
-
mcp_query_table/sites/eastmoney.py,sha256=LImjpYVuM5YnXwnNzB2hkKfHofocZZScetGqMOCHZpk,4477
|
|
13
|
-
mcp_query_table/sites/iwencai.py,sha256=g56pj3pbxu4mXLNnaaS3Hdx-DvEy_9OBrQJe26z4z08,5059
|
|
14
|
-
mcp_query_table/sites/tdx.py,sha256=RIUQaB7Tn4AVyWaevk9SzTKIDwVO2f9erIlI-adXPLY,4126
|
|
15
|
-
mcp_query_table-0.3.2.dist-info/licenses/LICENSE,sha256=rbvv_CTd7biGwT21tvhgQ2zkbPFXOoON7WFQWEdElBA,1063
|
|
16
|
-
mcp_query_table-0.3.2.dist-info/METADATA,sha256=D9kCuwRBvBsn1RRc0ysYwSPia_94ferz8UVlye68GwM,8187
|
|
17
|
-
mcp_query_table-0.3.2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
|
18
|
-
mcp_query_table-0.3.2.dist-info/top_level.txt,sha256=5M_8dkO1USOX7_EWbWS6O_TEsZ5yo-AodFNKeUEgvEQ,16
|
|
19
|
-
mcp_query_table-0.3.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|