arcade-scavio 0.1.0__tar.gz
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.
- arcade_scavio-0.1.0/.github/workflows/publish.yml +44 -0
- arcade_scavio-0.1.0/.gitignore +15 -0
- arcade_scavio-0.1.0/LICENSE +21 -0
- arcade_scavio-0.1.0/PKG-INFO +74 -0
- arcade_scavio-0.1.0/README.md +54 -0
- arcade_scavio-0.1.0/pyproject.toml +36 -0
- arcade_scavio-0.1.0/src/arcade_scavio/__init__.py +3 -0
- arcade_scavio-0.1.0/src/arcade_scavio/server.py +95 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
pypi:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: "3.12"
|
|
17
|
+
|
|
18
|
+
- name: Check if version is new
|
|
19
|
+
id: check
|
|
20
|
+
run: |
|
|
21
|
+
NAME=$(grep -m1 '^name' pyproject.toml | sed -E 's/.*"(.*)".*/\1/')
|
|
22
|
+
VERSION=$(grep -m1 '^version' pyproject.toml | sed -E 's/.*"(.*)".*/\1/')
|
|
23
|
+
echo "version=$VERSION"
|
|
24
|
+
if curl -fsSL "https://pypi.org/pypi/$NAME/$VERSION/json" > /dev/null 2>&1; then
|
|
25
|
+
echo "new=false" >> "$GITHUB_OUTPUT"
|
|
26
|
+
echo "$NAME $VERSION already on PyPI, skipping"
|
|
27
|
+
else
|
|
28
|
+
echo "new=true" >> "$GITHUB_OUTPUT"
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
- name: Install build tools
|
|
32
|
+
if: steps.check.outputs.new == 'true'
|
|
33
|
+
run: pip install build twine
|
|
34
|
+
|
|
35
|
+
- name: Build
|
|
36
|
+
if: steps.check.outputs.new == 'true'
|
|
37
|
+
run: python -m build
|
|
38
|
+
|
|
39
|
+
- name: Publish to PyPI
|
|
40
|
+
if: steps.check.outputs.new == 'true'
|
|
41
|
+
env:
|
|
42
|
+
TWINE_USERNAME: __token__
|
|
43
|
+
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
|
|
44
|
+
run: twine upload dist/*
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Scavio
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: arcade-scavio
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Scavio real-time search tools (Google, Google News, Reddit, YouTube, Amazon) for Arcade.dev / MCP
|
|
5
|
+
Project-URL: Homepage, https://scavio.dev
|
|
6
|
+
Project-URL: Repository, https://github.com/scavio-ai/arcade-scavio
|
|
7
|
+
Project-URL: Documentation, https://scavio.dev/docs/arcade
|
|
8
|
+
Author-email: Scavio <support@scavio.dev>
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: arcade,arcade-ai,mcp,scavio,search,serp,tavily-alternative,tools
|
|
12
|
+
Requires-Python: >=3.10
|
|
13
|
+
Requires-Dist: arcade-mcp-server<2.0.0,>=1.17.4
|
|
14
|
+
Requires-Dist: scavio>=0.5.0
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: arcade-mcp[all]<2.0.0,>=1.11.2; extra == 'dev'
|
|
17
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
|
|
18
|
+
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
|
|
21
|
+
# arcade-scavio
|
|
22
|
+
|
|
23
|
+
[Scavio](https://scavio.dev) real-time search tools for [Arcade.dev](https://arcade.dev) and MCP — Google, Google News, Reddit, YouTube, and Amazon, with one API key. A cost-effective [Tavily alternative](https://scavio.dev/docs) and [SerpAPI alternative](https://scavio.dev/docs) for Arcade agents.
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install arcade-scavio
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Tools
|
|
32
|
+
|
|
33
|
+
An `arcade-mcp-server` toolkit exposing:
|
|
34
|
+
|
|
35
|
+
| Tool | Description |
|
|
36
|
+
|---|---|
|
|
37
|
+
| `search_google` | Google SERP — real-time organic web results |
|
|
38
|
+
| `search_news` | Google News — recent articles on a topic |
|
|
39
|
+
| `search_reddit` | Reddit posts — community discussion and sentiment |
|
|
40
|
+
| `search_youtube` | YouTube — videos |
|
|
41
|
+
| `search_amazon` | Amazon — product listings |
|
|
42
|
+
|
|
43
|
+
Each tool reads the `SCAVIO_API_KEY` secret, which Arcade injects securely at call time (the client and LLM never see the value).
|
|
44
|
+
|
|
45
|
+
## Run standalone
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
export SCAVIO_API_KEY=sk_live_... # get one at https://dashboard.scavio.dev
|
|
49
|
+
python -m arcade_scavio.server # stdio
|
|
50
|
+
python -m arcade_scavio.server http # HTTP+SSE
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Deploy to Arcade Cloud
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
arcade login
|
|
57
|
+
arcade deploy
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Arcade discovers the `SCAVIO_API_KEY` secret and hosts it encrypted; the Arcade Engine fulfils authorized tool calls for your users.
|
|
61
|
+
|
|
62
|
+
## Every endpoint via MCP
|
|
63
|
+
|
|
64
|
+
Need Walmart, TikTok, Instagram, Maps, Shopping, and more? Scavio also runs a hosted MCP server at [`mcp.scavio.dev`](https://scavio.dev/docs/mcp) with the full tool catalog.
|
|
65
|
+
|
|
66
|
+
## About Scavio
|
|
67
|
+
|
|
68
|
+
[Scavio](https://scavio.dev) is a real-time search API built for AI agents — a unified API over Google, YouTube, Amazon, Walmart, Reddit, TikTok, and Instagram that returns clean JSON. A broader, cost-effective [Tavily alternative](https://scavio.dev/docs) and [SerpAPI alternative](https://scavio.dev/docs). See the [Arcade integration docs](https://scavio.dev/docs/arcade).
|
|
69
|
+
|
|
70
|
+
## Links
|
|
71
|
+
|
|
72
|
+
- Scavio: https://scavio.dev
|
|
73
|
+
- Docs: https://scavio.dev/docs/arcade
|
|
74
|
+
- Dashboard: https://dashboard.scavio.dev
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# arcade-scavio
|
|
2
|
+
|
|
3
|
+
[Scavio](https://scavio.dev) real-time search tools for [Arcade.dev](https://arcade.dev) and MCP — Google, Google News, Reddit, YouTube, and Amazon, with one API key. A cost-effective [Tavily alternative](https://scavio.dev/docs) and [SerpAPI alternative](https://scavio.dev/docs) for Arcade agents.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install arcade-scavio
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Tools
|
|
12
|
+
|
|
13
|
+
An `arcade-mcp-server` toolkit exposing:
|
|
14
|
+
|
|
15
|
+
| Tool | Description |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `search_google` | Google SERP — real-time organic web results |
|
|
18
|
+
| `search_news` | Google News — recent articles on a topic |
|
|
19
|
+
| `search_reddit` | Reddit posts — community discussion and sentiment |
|
|
20
|
+
| `search_youtube` | YouTube — videos |
|
|
21
|
+
| `search_amazon` | Amazon — product listings |
|
|
22
|
+
|
|
23
|
+
Each tool reads the `SCAVIO_API_KEY` secret, which Arcade injects securely at call time (the client and LLM never see the value).
|
|
24
|
+
|
|
25
|
+
## Run standalone
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
export SCAVIO_API_KEY=sk_live_... # get one at https://dashboard.scavio.dev
|
|
29
|
+
python -m arcade_scavio.server # stdio
|
|
30
|
+
python -m arcade_scavio.server http # HTTP+SSE
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Deploy to Arcade Cloud
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
arcade login
|
|
37
|
+
arcade deploy
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Arcade discovers the `SCAVIO_API_KEY` secret and hosts it encrypted; the Arcade Engine fulfils authorized tool calls for your users.
|
|
41
|
+
|
|
42
|
+
## Every endpoint via MCP
|
|
43
|
+
|
|
44
|
+
Need Walmart, TikTok, Instagram, Maps, Shopping, and more? Scavio also runs a hosted MCP server at [`mcp.scavio.dev`](https://scavio.dev/docs/mcp) with the full tool catalog.
|
|
45
|
+
|
|
46
|
+
## About Scavio
|
|
47
|
+
|
|
48
|
+
[Scavio](https://scavio.dev) is a real-time search API built for AI agents — a unified API over Google, YouTube, Amazon, Walmart, Reddit, TikTok, and Instagram that returns clean JSON. A broader, cost-effective [Tavily alternative](https://scavio.dev/docs) and [SerpAPI alternative](https://scavio.dev/docs). See the [Arcade integration docs](https://scavio.dev/docs/arcade).
|
|
49
|
+
|
|
50
|
+
## Links
|
|
51
|
+
|
|
52
|
+
- Scavio: https://scavio.dev
|
|
53
|
+
- Docs: https://scavio.dev/docs/arcade
|
|
54
|
+
- Dashboard: https://dashboard.scavio.dev
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "arcade-scavio"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Scavio real-time search tools (Google, Google News, Reddit, YouTube, Amazon) for Arcade.dev / MCP"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
license = { text = "MIT" }
|
|
8
|
+
authors = [{ name = "Scavio", email = "support@scavio.dev" }]
|
|
9
|
+
keywords = ["arcade", "arcade-ai", "mcp", "scavio", "search", "serp", "tools", "tavily-alternative"]
|
|
10
|
+
dependencies = [
|
|
11
|
+
"arcade-mcp-server>=1.17.4,<2.0.0",
|
|
12
|
+
"scavio>=0.5.0",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
[project.optional-dependencies]
|
|
16
|
+
dev = [
|
|
17
|
+
"arcade-mcp[all]>=1.11.2,<2.0.0",
|
|
18
|
+
"pytest>=7.0.0",
|
|
19
|
+
"pytest-asyncio>=0.21.0",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
[project.urls]
|
|
23
|
+
Homepage = "https://scavio.dev"
|
|
24
|
+
Repository = "https://github.com/scavio-ai/arcade-scavio"
|
|
25
|
+
Documentation = "https://scavio.dev/docs/arcade"
|
|
26
|
+
|
|
27
|
+
# Tell Arcade.dev that this package ships Arcade tools
|
|
28
|
+
[project.entry-points.arcade_toolkits]
|
|
29
|
+
scavio = "arcade_scavio"
|
|
30
|
+
|
|
31
|
+
[build-system]
|
|
32
|
+
requires = ["hatchling"]
|
|
33
|
+
build-backend = "hatchling.build"
|
|
34
|
+
|
|
35
|
+
[tool.hatch.build.targets.wheel]
|
|
36
|
+
packages = ["src/arcade_scavio"]
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""Scavio real-time search tools for Arcade.dev / MCP.
|
|
2
|
+
|
|
3
|
+
Exposes Scavio's search across Google, Google News, Reddit, YouTube, and Amazon
|
|
4
|
+
as Arcade tools. The Scavio API key is injected securely by Arcade at call time
|
|
5
|
+
via the SCAVIO_API_KEY secret (the client and LLM never see it).
|
|
6
|
+
|
|
7
|
+
Run standalone:
|
|
8
|
+
uv run server.py # stdio
|
|
9
|
+
uv run server.py http # HTTP+SSE
|
|
10
|
+
|
|
11
|
+
Or deploy to Arcade Cloud with `arcade deploy`.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from typing import Annotated, Any
|
|
15
|
+
|
|
16
|
+
from arcade_mcp_server import Context, MCPApp
|
|
17
|
+
from scavio import AsyncScavioClient
|
|
18
|
+
|
|
19
|
+
app = MCPApp(name="scavio", version="0.1.0")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _client(context: Context) -> AsyncScavioClient:
|
|
23
|
+
return AsyncScavioClient(api_key=context.get_secret("SCAVIO_API_KEY"))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _nested(data: dict[str, Any], key: str) -> list:
|
|
27
|
+
inner = data.get("data")
|
|
28
|
+
if isinstance(inner, dict) and isinstance(inner.get(key), list):
|
|
29
|
+
return inner[key]
|
|
30
|
+
return data.get(key) if isinstance(data.get(key), list) else []
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@app.tool(requires_secrets=["SCAVIO_API_KEY"])
|
|
34
|
+
async def search_google(
|
|
35
|
+
context: Context,
|
|
36
|
+
query: Annotated[str, "The search query"],
|
|
37
|
+
max_results: Annotated[int, "Maximum number of results"] = 10,
|
|
38
|
+
) -> Annotated[list[dict], "Organic results (title, link, snippet)"]:
|
|
39
|
+
"""Search Google in real time with Scavio and return organic results."""
|
|
40
|
+
async with _client(context) as client:
|
|
41
|
+
data = await client.google.search(query)
|
|
42
|
+
return data.get("organic_results", [])[:max_results]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@app.tool(requires_secrets=["SCAVIO_API_KEY"])
|
|
46
|
+
async def search_news(
|
|
47
|
+
context: Context,
|
|
48
|
+
query: Annotated[str, "The news search query"],
|
|
49
|
+
max_results: Annotated[int, "Maximum number of results"] = 10,
|
|
50
|
+
) -> Annotated[list[dict], "Google News results"]:
|
|
51
|
+
"""Search Google News for recent articles on a topic with Scavio."""
|
|
52
|
+
async with _client(context) as client:
|
|
53
|
+
data = await client.google.news(query=query)
|
|
54
|
+
results = data.get("news_results") or data.get("results") or []
|
|
55
|
+
return results[:max_results]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@app.tool(requires_secrets=["SCAVIO_API_KEY"])
|
|
59
|
+
async def search_reddit(
|
|
60
|
+
context: Context,
|
|
61
|
+
query: Annotated[str, "The Reddit search query"],
|
|
62
|
+
max_results: Annotated[int, "Maximum number of results"] = 10,
|
|
63
|
+
) -> Annotated[list[dict], "Reddit posts"]:
|
|
64
|
+
"""Search Reddit posts for community discussion and sentiment with Scavio."""
|
|
65
|
+
async with _client(context) as client:
|
|
66
|
+
data = await client.reddit.search(query)
|
|
67
|
+
return _nested(data, "posts")[:max_results]
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@app.tool(requires_secrets=["SCAVIO_API_KEY"])
|
|
71
|
+
async def search_youtube(
|
|
72
|
+
context: Context,
|
|
73
|
+
query: Annotated[str, "The video search query"],
|
|
74
|
+
max_results: Annotated[int, "Maximum number of results"] = 10,
|
|
75
|
+
) -> Annotated[list[dict], "YouTube videos"]:
|
|
76
|
+
"""Search YouTube for videos with Scavio."""
|
|
77
|
+
async with _client(context) as client:
|
|
78
|
+
data = await client.youtube.search(query)
|
|
79
|
+
return _nested(data, "results")[:max_results]
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@app.tool(requires_secrets=["SCAVIO_API_KEY"])
|
|
83
|
+
async def search_amazon(
|
|
84
|
+
context: Context,
|
|
85
|
+
query: Annotated[str, "The product search query"],
|
|
86
|
+
max_results: Annotated[int, "Maximum number of results"] = 10,
|
|
87
|
+
) -> Annotated[list[dict], "Amazon products"]:
|
|
88
|
+
"""Search Amazon product listings with Scavio."""
|
|
89
|
+
async with _client(context) as client:
|
|
90
|
+
data = await client.amazon.search(query)
|
|
91
|
+
return _nested(data, "products")[:max_results]
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
if __name__ == "__main__":
|
|
95
|
+
app.run(transport="stdio")
|