tekneh 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.
- tekneh-0.1.0/.gitignore +23 -0
- tekneh-0.1.0/PKG-INFO +125 -0
- tekneh-0.1.0/README.md +112 -0
- tekneh-0.1.0/pyproject.toml +38 -0
- tekneh-0.1.0/src/tekneh_mcp/__init__.py +2 -0
- tekneh-0.1.0/src/tekneh_mcp/__main__.py +2 -0
- tekneh-0.1.0/src/tekneh_mcp/data/fields.csv +2520 -0
- tekneh-0.1.0/src/tekneh_mcp/data/meta.json +146 -0
- tekneh-0.1.0/src/tekneh_mcp/data/tools.csv +742 -0
- tekneh-0.1.0/src/tekneh_mcp/data/works.csv +230 -0
- tekneh-0.1.0/src/tekneh_mcp/query.py +251 -0
- tekneh-0.1.0/src/tekneh_mcp/server.py +176 -0
tekneh-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Nested sibling checkouts (own remotes)
|
|
2
|
+
/tekneh_web/
|
|
3
|
+
/tekneh_research/
|
|
4
|
+
/meta_artpaper_paper/
|
|
5
|
+
/mid/
|
|
6
|
+
# Site deploy wrapper (lives with tekneh_web; not part of the PyPI package)
|
|
7
|
+
/deploy.sh
|
|
8
|
+
# Local export accidents
|
|
9
|
+
/tekneh-public/
|
|
10
|
+
/tekneh-pkg/
|
|
11
|
+
# sync.sh copies (source of truth: tekneh_research)
|
|
12
|
+
/src/tekneh_mcp/data/
|
|
13
|
+
/src/tekneh_mcp/query.py
|
|
14
|
+
# Tooling / build
|
|
15
|
+
.venv/
|
|
16
|
+
dist/
|
|
17
|
+
*.egg-info/
|
|
18
|
+
__pycache__/
|
|
19
|
+
*.pyc
|
|
20
|
+
.env
|
|
21
|
+
.env.*
|
|
22
|
+
!.env.example
|
|
23
|
+
*.PNG
|
tekneh-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: tekneh
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: SIGGRAPH and SIGGRAPH Asia art-paper technē corpus — what papers state about making media art, and what they leave unstated
|
|
5
|
+
Project-URL: Homepage, https://tekneh.com
|
|
6
|
+
Project-URL: Repository, https://github.com/joonhyungbae/tekneh
|
|
7
|
+
Project-URL: Documentation, https://tekneh.com/about.html
|
|
8
|
+
Author-email: Joonhyung Bae <jh.bae@kaist.ac.kr>
|
|
9
|
+
License: CC-BY-4.0
|
|
10
|
+
Requires-Python: >=3.10
|
|
11
|
+
Requires-Dist: mcp>=1.2.0
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
|
|
14
|
+
# Tekneh MCP
|
|
15
|
+
|
|
16
|
+
An MCP server for asking what SIGGRAPH and SIGGRAPH Asia art papers **wrote — and did not write — about implementation**.
|
|
17
|
+
|
|
18
|
+
It ships a corpus of 229 work papers (2009–2026) fully coded on 11 implementation fields.
|
|
19
|
+
Data is bundled in the package, so **no server and no network are required.** CSV is 566KB; it starts instantly.
|
|
20
|
+
|
|
21
|
+
## Install — any MCP client
|
|
22
|
+
|
|
23
|
+
MCP is an open protocol. **This server is not tied to any one vendor’s product.** It speaks standard JSON-RPC over stdio, so any MCP-capable client can attach. Most use the block below as-is.
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{ "mcpServers": { "tekneh": { "command": "uvx", "args": ["tekneh"] } } }
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Public source and PyPI metadata Repository: **`https://github.com/joonhyungbae/tekneh`**.
|
|
30
|
+
Author: Joonhyung Bae \<jh.bae@kaist.ac.kr\>. You do not need to put PyPI/GitHub in the paper body.
|
|
31
|
+
Export and history cleanup: `EXPORT.md`.
|
|
32
|
+
| Client | Where to put it | Differences |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| Claude Code | `claude mcp add tekneh -- uvx tekneh` | or `.mcp.json` |
|
|
35
|
+
| Claude Desktop | `claude_desktop_config.json` | block above as-is |
|
|
36
|
+
| Cursor | `~/.cursor/mcp.json` · `.cursor/mcp.json` | block above as-is |
|
|
37
|
+
| Cline · Continue · Windsurf | each extension’s MCP settings | block above as-is |
|
|
38
|
+
| VS Code (Copilot agent) | `.vscode/mcp.json` | top-level key is **`servers`**; entry needs `"type": "stdio"` |
|
|
39
|
+
| Zed | `settings.json` | top-level key is **`context_servers`** |
|
|
40
|
+
| Codex CLI | `~/.codex/config.toml` | **TOML** — see below |
|
|
41
|
+
|
|
42
|
+
```toml
|
|
43
|
+
# ~/.codex/config.toml
|
|
44
|
+
[mcp_servers.tekneh]
|
|
45
|
+
command = "uvx"
|
|
46
|
+
args = ["tekneh"]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Config schemas drift a little by client. If it does not attach, check only the key names in that tool’s latest MCP docs — `command`/`args` are the same everywhere.
|
|
50
|
+
|
|
51
|
+
### Transport
|
|
52
|
+
|
|
53
|
+
Default is **stdio**; all settings above use it. For remote or web clients:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
tekneh --http --port 6230 # streamable-http, http://127.0.0.1:6230/mcp
|
|
57
|
+
tekneh --sse # legacy SSE
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{ "mcpServers": { "tekneh": { "url": "http://127.0.0.1:6230/mcp" } } }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
From inside the repo, run `python -m tekneh_mcp`. Data location: `TEKNEH_DATA=/path` or `--data`.
|
|
65
|
+
|
|
66
|
+
### If the tool does not use MCP
|
|
67
|
+
|
|
68
|
+
The same queries are available via the MCP tools above (or `uvx tekneh` with an MCP client).
|
|
69
|
+
Return shape matches the tool results. Codebook role labels such as `런타임` (runtime) are stored as-is in the CSVs.
|
|
70
|
+
|
|
71
|
+
## Five tools
|
|
72
|
+
|
|
73
|
+
| Tool | What it does |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `corpus_info` | Corpus boundary · population · human-confirmed values · citation rules. **Call this first** |
|
|
76
|
+
| `field_stats` | How often a field is stated. Denominator and absent count together |
|
|
77
|
+
| `search_works` | Search works. **Filter with `absent` for “what the paper did not write”** |
|
|
78
|
+
| `works_using` | Works that used a given tool. `role` separates runtime / production / learning |
|
|
79
|
+
| `cite` | Source quote (20 words) · section locus · doi |
|
|
80
|
+
|
|
81
|
+
## Four reading rules
|
|
82
|
+
|
|
83
|
+
This corpus is valuable because **you can count what is missing**. Reading it differs from the usual.
|
|
84
|
+
|
|
85
|
+
1. **`absent` is a property of the document, not the work.** Not “this work used no power,” but
|
|
86
|
+
**“not stated in the paper (whether it existed is unknown).”** Use the return’s `phrasing` and `reading_note` as written.
|
|
87
|
+
2. **If `small_cell` is true, do not generalize.** Denominator under 30. Sound has 27 papers, robotics 30, so
|
|
88
|
+
“sound is done with Max/MSP” (4/27) is false. Always report the denominator.
|
|
89
|
+
3. **State `boundary` in the answer.** SIGGRAPH and SIGGRAPH Asia art papers 2009–2026 only.
|
|
90
|
+
No Ars Electronica, NIME, ISEA, exhibition catalogs, or artist websites. The population is **papers, not works**.
|
|
91
|
+
4. **If `use_this` is present, use that value, not `rate`.** The machine overcounts prose lists and third-party URLs as stated.
|
|
92
|
+
|
|
93
|
+
| Field | Machine | Value to use |
|
|
94
|
+
|---|---:|---|
|
|
95
|
+
| Venue requirements | 25.9% | **20.5%** (16.2–24.8) |
|
|
96
|
+
| Reproducibility (public) | 10.5% | **6.1%** — a **lower bound**, not a point estimate. Write “6–14%” |
|
|
97
|
+
|
|
98
|
+
## What this corpus does well / poorly
|
|
99
|
+
|
|
100
|
+
**Does well.** What it was made with — tools named in 79% of papers; 457 unique kinds with
|
|
101
|
+
runtime / production / learning roles. Form × tool join reaches 80%.
|
|
102
|
+
|
|
103
|
+
**Does poorly.** How to remake it. Venue conditions are stated in 20.5%; public release in only 6–14%.
|
|
104
|
+
It cannot help with circuit debugging — papers do not record wiring faults.
|
|
105
|
+
Turning `absent` into **questions to ask the artist** is the proper use of this data.
|
|
106
|
+
|
|
107
|
+
## Citation
|
|
108
|
+
|
|
109
|
+
Annotations are CC BY 4.0. **Source quotes are capped at 20 words per field**; the server enforces that bound.
|
|
110
|
+
For more, follow `doi` to the original paper — ACM DL blocks scripted access, so do not crawl.
|
|
111
|
+
|
|
112
|
+
## Building from the repository
|
|
113
|
+
|
|
114
|
+
Shipped wheels already include `query.py` and the CSV tables under `src/tekneh_mcp/`.
|
|
115
|
+
Those files are produced before `uv build` and are not committed.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
bash sync.sh # maintainers: refresh bundled data, then:
|
|
119
|
+
uv build
|
|
120
|
+
UV_PUBLISH_TOKEN=pypi-... bash publish.sh --upload
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Or use GitHub Actions Trusted Publishing so Actions uploads without a token — often requires a public repo.
|
|
124
|
+
|
|
125
|
+
See `EXPORT.md` for packaging notes.
|
tekneh-0.1.0/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Tekneh MCP
|
|
2
|
+
|
|
3
|
+
An MCP server for asking what SIGGRAPH and SIGGRAPH Asia art papers **wrote — and did not write — about implementation**.
|
|
4
|
+
|
|
5
|
+
It ships a corpus of 229 work papers (2009–2026) fully coded on 11 implementation fields.
|
|
6
|
+
Data is bundled in the package, so **no server and no network are required.** CSV is 566KB; it starts instantly.
|
|
7
|
+
|
|
8
|
+
## Install — any MCP client
|
|
9
|
+
|
|
10
|
+
MCP is an open protocol. **This server is not tied to any one vendor’s product.** It speaks standard JSON-RPC over stdio, so any MCP-capable client can attach. Most use the block below as-is.
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{ "mcpServers": { "tekneh": { "command": "uvx", "args": ["tekneh"] } } }
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Public source and PyPI metadata Repository: **`https://github.com/joonhyungbae/tekneh`**.
|
|
17
|
+
Author: Joonhyung Bae \<jh.bae@kaist.ac.kr\>. You do not need to put PyPI/GitHub in the paper body.
|
|
18
|
+
Export and history cleanup: `EXPORT.md`.
|
|
19
|
+
| Client | Where to put it | Differences |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| Claude Code | `claude mcp add tekneh -- uvx tekneh` | or `.mcp.json` |
|
|
22
|
+
| Claude Desktop | `claude_desktop_config.json` | block above as-is |
|
|
23
|
+
| Cursor | `~/.cursor/mcp.json` · `.cursor/mcp.json` | block above as-is |
|
|
24
|
+
| Cline · Continue · Windsurf | each extension’s MCP settings | block above as-is |
|
|
25
|
+
| VS Code (Copilot agent) | `.vscode/mcp.json` | top-level key is **`servers`**; entry needs `"type": "stdio"` |
|
|
26
|
+
| Zed | `settings.json` | top-level key is **`context_servers`** |
|
|
27
|
+
| Codex CLI | `~/.codex/config.toml` | **TOML** — see below |
|
|
28
|
+
|
|
29
|
+
```toml
|
|
30
|
+
# ~/.codex/config.toml
|
|
31
|
+
[mcp_servers.tekneh]
|
|
32
|
+
command = "uvx"
|
|
33
|
+
args = ["tekneh"]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Config schemas drift a little by client. If it does not attach, check only the key names in that tool’s latest MCP docs — `command`/`args` are the same everywhere.
|
|
37
|
+
|
|
38
|
+
### Transport
|
|
39
|
+
|
|
40
|
+
Default is **stdio**; all settings above use it. For remote or web clients:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
tekneh --http --port 6230 # streamable-http, http://127.0.0.1:6230/mcp
|
|
44
|
+
tekneh --sse # legacy SSE
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{ "mcpServers": { "tekneh": { "url": "http://127.0.0.1:6230/mcp" } } }
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
From inside the repo, run `python -m tekneh_mcp`. Data location: `TEKNEH_DATA=/path` or `--data`.
|
|
52
|
+
|
|
53
|
+
### If the tool does not use MCP
|
|
54
|
+
|
|
55
|
+
The same queries are available via the MCP tools above (or `uvx tekneh` with an MCP client).
|
|
56
|
+
Return shape matches the tool results. Codebook role labels such as `런타임` (runtime) are stored as-is in the CSVs.
|
|
57
|
+
|
|
58
|
+
## Five tools
|
|
59
|
+
|
|
60
|
+
| Tool | What it does |
|
|
61
|
+
|---|---|
|
|
62
|
+
| `corpus_info` | Corpus boundary · population · human-confirmed values · citation rules. **Call this first** |
|
|
63
|
+
| `field_stats` | How often a field is stated. Denominator and absent count together |
|
|
64
|
+
| `search_works` | Search works. **Filter with `absent` for “what the paper did not write”** |
|
|
65
|
+
| `works_using` | Works that used a given tool. `role` separates runtime / production / learning |
|
|
66
|
+
| `cite` | Source quote (20 words) · section locus · doi |
|
|
67
|
+
|
|
68
|
+
## Four reading rules
|
|
69
|
+
|
|
70
|
+
This corpus is valuable because **you can count what is missing**. Reading it differs from the usual.
|
|
71
|
+
|
|
72
|
+
1. **`absent` is a property of the document, not the work.** Not “this work used no power,” but
|
|
73
|
+
**“not stated in the paper (whether it existed is unknown).”** Use the return’s `phrasing` and `reading_note` as written.
|
|
74
|
+
2. **If `small_cell` is true, do not generalize.** Denominator under 30. Sound has 27 papers, robotics 30, so
|
|
75
|
+
“sound is done with Max/MSP” (4/27) is false. Always report the denominator.
|
|
76
|
+
3. **State `boundary` in the answer.** SIGGRAPH and SIGGRAPH Asia art papers 2009–2026 only.
|
|
77
|
+
No Ars Electronica, NIME, ISEA, exhibition catalogs, or artist websites. The population is **papers, not works**.
|
|
78
|
+
4. **If `use_this` is present, use that value, not `rate`.** The machine overcounts prose lists and third-party URLs as stated.
|
|
79
|
+
|
|
80
|
+
| Field | Machine | Value to use |
|
|
81
|
+
|---|---:|---|
|
|
82
|
+
| Venue requirements | 25.9% | **20.5%** (16.2–24.8) |
|
|
83
|
+
| Reproducibility (public) | 10.5% | **6.1%** — a **lower bound**, not a point estimate. Write “6–14%” |
|
|
84
|
+
|
|
85
|
+
## What this corpus does well / poorly
|
|
86
|
+
|
|
87
|
+
**Does well.** What it was made with — tools named in 79% of papers; 457 unique kinds with
|
|
88
|
+
runtime / production / learning roles. Form × tool join reaches 80%.
|
|
89
|
+
|
|
90
|
+
**Does poorly.** How to remake it. Venue conditions are stated in 20.5%; public release in only 6–14%.
|
|
91
|
+
It cannot help with circuit debugging — papers do not record wiring faults.
|
|
92
|
+
Turning `absent` into **questions to ask the artist** is the proper use of this data.
|
|
93
|
+
|
|
94
|
+
## Citation
|
|
95
|
+
|
|
96
|
+
Annotations are CC BY 4.0. **Source quotes are capped at 20 words per field**; the server enforces that bound.
|
|
97
|
+
For more, follow `doi` to the original paper — ACM DL blocks scripted access, so do not crawl.
|
|
98
|
+
|
|
99
|
+
## Building from the repository
|
|
100
|
+
|
|
101
|
+
Shipped wheels already include `query.py` and the CSV tables under `src/tekneh_mcp/`.
|
|
102
|
+
Those files are produced before `uv build` and are not committed.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
bash sync.sh # maintainers: refresh bundled data, then:
|
|
106
|
+
uv build
|
|
107
|
+
UV_PUBLISH_TOKEN=pypi-... bash publish.sh --upload
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Or use GitHub Actions Trusted Publishing so Actions uploads without a token — often requires a public repo.
|
|
111
|
+
|
|
112
|
+
See `EXPORT.md` for packaging notes.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "tekneh"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "SIGGRAPH and SIGGRAPH Asia art-paper technē corpus — what papers state about making media art, and what they leave unstated"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
license = { text = "CC-BY-4.0" }
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "Joonhyung Bae", email = "jh.bae@kaist.ac.kr" },
|
|
10
|
+
]
|
|
11
|
+
dependencies = ["mcp>=1.2.0"]
|
|
12
|
+
|
|
13
|
+
[project.urls]
|
|
14
|
+
Homepage = "https://tekneh.com"
|
|
15
|
+
Repository = "https://github.com/joonhyungbae/tekneh"
|
|
16
|
+
Documentation = "https://tekneh.com/about.html"
|
|
17
|
+
|
|
18
|
+
[project.scripts]
|
|
19
|
+
tekneh = "tekneh_mcp.server:main"
|
|
20
|
+
|
|
21
|
+
[build-system]
|
|
22
|
+
requires = ["hatchling"]
|
|
23
|
+
build-backend = "hatchling.build"
|
|
24
|
+
|
|
25
|
+
# data/·query.py are sync.sh copies and gitignored. ignore-vcs so the wheel still
|
|
26
|
+
# ships them. only-include keeps nested research/site checkouts out of the sdist.
|
|
27
|
+
[tool.hatch.build]
|
|
28
|
+
ignore-vcs = true
|
|
29
|
+
|
|
30
|
+
[tool.hatch.build.targets.sdist]
|
|
31
|
+
only-include = [
|
|
32
|
+
"src/tekneh_mcp",
|
|
33
|
+
"README.md",
|
|
34
|
+
"pyproject.toml",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[tool.hatch.build.targets.wheel]
|
|
38
|
+
packages = ["src/tekneh_mcp"]
|