luz-mcp 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.
@@ -0,0 +1,7 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ dist/
5
+ uv.lock
6
+ .env
7
+ .pytest_cache/
@@ -0,0 +1,13 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 · sin publicar
4
+
5
+ Primera versión (plan: `docs/PLAN_mcp.md`).
6
+
7
+ - Perfil de Luz y Taquígrafos V3 sobre el motor de parlaibero-mcp 0.4: las herramientas de discurso,
8
+ bibliotecas y exportación, con `party_family`, `ideology` y las etiquetas del registro (`reg_*`).
9
+ - Tablas de Afinidades Elegidas 2.0 y nueve herramientas: medidas y firmas, red de coautorías,
10
+ métricas y roles publicados, y discurso × red.
11
+ - Comprobaciones en cada carga: las cifras publicadas, los enlaces de las medidas al Diario (fecha y
12
+ defensor) y el grado de cada diputado, recalculado desde la lista de aristas.
13
+ - Bibliotecas para el explorador de Luz con los números de fila de la V3, comprobadas contra su motor real.
@@ -0,0 +1,22 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use this software, cite it as below. Cite also each dataset you use, with its version."
3
+ title: "luz-mcp: MCP server for Luz y Taquígrafos and Afinidades Elegidas"
4
+ type: software
5
+ authors:
6
+ - family-names: Rodrigues-Silveira
7
+ given-names: Rodrigo
8
+ orcid: "https://orcid.org/0000-0002-6912-7689"
9
+ affiliation: "Universidad de Salamanca"
10
+ version: "0.1.0"
11
+ date-released: "2026-10-04"
12
+ license: MIT
13
+ repository-code: "https://github.com/rodrodr/luz-tools"
14
+ references:
15
+ - type: dataset
16
+ title: "Luz y Taquígrafos: Parliamentary Debates in the Second Spanish Republic, 1931–1945"
17
+ doi: "10.7910/DVN/THQCMI"
18
+ authors: [{family-names: Rodrigues-Silveira, given-names: Rodrigo}, {family-names: García-Díez, given-names: Fátima}, {family-names: Llamazares, given-names: Iván}, {family-names: Martínez-Barahona, given-names: Elena}, {family-names: Barreto Martín, given-names: Eduardo}]
19
+ - type: dataset
20
+ title: "Afinidades Elegidas: Parliamentary Cosponsorship Networks of the Spanish Second Republic (1931-1939)"
21
+ doi: "10.7910/DVN/CGOCUS"
22
+ authors: [{family-names: Rodrigues-Silveira, given-names: Rodrigo}, {family-names: García-Díez, given-names: Fátima}, {family-names: Llamazares, given-names: Iván}, {family-names: Martínez-Barahona, given-names: Elena}, {family-names: Barreto Martín, given-names: Eduardo}]
luz_mcp-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rodrigo Rodrigues-Silveira, Instituto de Iberoamérica, Universidad de Salamanca
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.
luz_mcp-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,181 @@
1
+ Metadata-Version: 2.5
2
+ Name: luz-mcp
3
+ Version: 0.1.0
4
+ Summary: MCP server for Luz y Taquígrafos (debates of the Spanish Second Republic) and Afinidades Elegidas (its co-sponsorship networks)
5
+ Project-URL: Repository, https://github.com/rodrodr/luz-tools
6
+ Project-URL: Luz y Taquígrafos, https://doi.org/10.7910/DVN/THQCMI
7
+ Project-URL: Afinidades Elegidas, https://doi.org/10.7910/DVN/CGOCUS
8
+ Author: Rodrigo Rodrigues-Silveira
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: Second Spanish Republic,Segunda República,co-sponsorship networks,corpus,mcp,parliament,parliamentary speeches
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: Natural Language :: English
15
+ Classifier: Natural Language :: Spanish
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
19
+ Classifier: Topic :: Sociology :: History
20
+ Classifier: Topic :: Text Processing :: Linguistic
21
+ Requires-Python: >=3.10
22
+ Requires-Dist: parlaibero-mcp<0.5,>=0.4
23
+ Description-Content-Type: text/markdown
24
+
25
+ # luz-mcp · Segunda República
26
+
27
+ **Español** · [English](#english)
28
+
29
+ Servidor MCP para consultar, desde Claude, ChatGPT, Cursor, Antigravity, OpenCode o cualquier
30
+ asistente de IA compatible, dos conjuntos de datos del Congreso de los Diputados de la Segunda
31
+ República española:
32
+
33
+ - **[Luz y Taquígrafos](https://doi.org/10.7910/DVN/THQCMI)**: los debates del pleno de 1931 a 1939,
34
+ más cinco sesiones del exilio en 1945. Son 121 700 filas en 755 sesiones, cada intervención con su
35
+ diputado.
36
+ - **[Afinidades Elegidas](https://doi.org/10.7910/DVN/CGOCUS)**: las 1 560 iniciativas firmadas
37
+ colectivamente, con su texto íntegro, sus 13 028 firmas, la red de coautorías y sus métricas de
38
+ red publicadas.
39
+
40
+ Los dos están en Harvard Dataverse con licencia CC BY 4.0, y el servidor los cruza: de una medida
41
+ salta al debate en que se leyó y se defendió, y de la posición de un diputado en la red, a lo que
42
+ dijo en el pleno.
43
+
44
+ ## Instalación
45
+
46
+ Requisito: [uv](https://docs.astral.sh/uv/getting-started/installation/).
47
+
48
+ **Claude Code**
49
+
50
+ ```bash
51
+ claude mcp add luz -s user -- uvx luz-mcp
52
+ ```
53
+
54
+ **Otros clientes** (bloque `mcpServers` de su configuración):
55
+
56
+ ```json
57
+ { "mcpServers": { "luz": { "command": "uvx", "args": ["luz-mcp"] } } }
58
+ ```
59
+
60
+ Los datos se descargan una vez, con la herramienta `download_data` o desde la terminal. Son unos
61
+ 210 MB y se guardan en `~/.luz`, o en la carpeta que indique `LUZ_HOME`:
62
+
63
+ ```bash
64
+ uvx luz-mcp download
65
+ ```
66
+
67
+ ## Qué se puede preguntar
68
+
69
+ - *«¿Cómo evoluciona "reforma agraria" frente a "orden público" entre 1931 y 1936?»*: `ngram_viewer`
70
+ - *«¿Qué familias políticas hablan más de lo que les corresponde por escaños en las Constituyentes?»*:
71
+ `share_of_voice`
72
+ - *«¿Qué palabras distinguen a los socialistas de los conservadores, sin la presidencia?»*:
73
+ `distinctive_words`
74
+ - *«Busca las enmiendas de tema agrario defendidas en el pleno y enséñame el debate»*:
75
+ `search_measures` y `get_measure`
76
+ - *«¿Entre qué familias se firman más iniciativas conjuntas en la segunda legislatura?»*:
77
+ `cross_group_coauthorship`
78
+ - *«¿Hablan distinto en el pleno los diputados que articulan la red y los que se quedan en su
79
+ partido?»*: `speech_by_network` y `distinctive_words`
80
+
81
+ ## Herramientas
82
+
83
+ | grupo | herramientas |
84
+ |---|---|
85
+ | datos | `list_datasets` · `download_data` · `get_documentation` · `how_to_cite` · `describe_data` |
86
+ | discurso | `coverage` · `ngram_viewer` · `term_counter` · `term_frequency` · `share_of_voice` · `distinctive_words` · `kwic` · `collocations` · `search_text` · `get_intervention` · `get_session` |
87
+ | bibliotecas | `library_create` · `library_describe` · `library_edit` · `library_combine` · `library_rebuild` · `library_delete` · `library_export` · `library_import` |
88
+ | medidas | `search_measures` · `get_measure` |
89
+ | red | `coauthorship_network` (exporta GraphML o CSV para Gephi, igraph o R) · `deputy_neighbors` · `cross_group_coauthorship` |
90
+ | métricas | `network_metrics` · `structural_roles` (las publicadas, sin recalcular) |
91
+ | discurso × red | `speech_by_network` · `deputy_profile` |
92
+ | reproducibilidad | `query_sql` (SQL de solo lectura) · `export_result` · `query_log` |
93
+
94
+ ## Lo que conviene saber
95
+
96
+ - **No hay variable de sexo** en ninguno de los dos conjuntos, así que nada se desglosa por sexo.
97
+ - **No todo es discurso.** `SUMARIO`, el sumario de cada sesión, y `COMENTARIOS`, que son documentos
98
+ leídos, votaciones y la narración del Diario, son `dm_speech = 0`.
99
+ - **Hay dos juegos de etiquetas.** El de Luz y Taquígrafos (`party`, `party_family`, `ideology`) y el
100
+ del registro revisado de Afinidades (`reg_party`, `reg_family`, `reg_ideology`). Para comparar voz
101
+ y escaños se usan los segundos, porque son los que comparte la lista de miembros. Los ministros
102
+ que hablan en una legislatura en la que no tenían escaño no tienen etiqueta de registro.
103
+ - **La misma legislatura se rotula distinto.** Luz y Taquígrafos dice 1933-1935 y Afinidades,
104
+ 1933-1936.
105
+ - **Las métricas y roles de red son los publicados.** Al cargar los datos, el grado de cada
106
+ diputado se recalcula desde la lista de aristas y se comprueba que coincide.
107
+ - **Algunas listas de firmas están truncadas en el Diario,** y a esas medidas les faltan aristas.
108
+ - **La presidencia queda fuera de `speech_by_network` por defecto.** No firma iniciativas, así que
109
+ aparece entre los diputados aislados de la red, pero habla en todas las sesiones para dar la
110
+ palabra.
111
+ - **Bibliotecas y explorador.** Las bibliotecas se exportan para el
112
+ [explorador de Luz y Taquígrafos](https://rodrodr.github.io/luz_explorer) con los números de
113
+ fila de la **versión 3**. Hay que importarlas allí con el CSV de la versión 3 cargado: el
114
+ explorador acepta también la versión 2, y en ella los mismos números son otras intervenciones.
115
+
116
+ ## Cómo está hecho
117
+
118
+ luz-mcp es un perfil del motor de [parlaibero-mcp](https://github.com/rodrodr/parlaibero-tools), el
119
+ servidor de los 16 parlamentos iberoamericanos. La búsqueda, los recuentos, las bibliotecas y la
120
+ exportación son el mismo código. Este paquete añade:
121
+
122
+ - cómo se leen los dos conjuntos;
123
+ - las tablas de Afinidades;
124
+ - las herramientas de medidas y red.
125
+
126
+ ```bash
127
+ uv run --with pytest pytest # pruebas sin red
128
+ ```
129
+
130
+ ## Cita y licencia
131
+
132
+ Cite cada conjunto con su versión (`how_to_cite`):
133
+
134
+ - Rodrigues-Silveira, R.; García-Díez, F.; Llamazares, I.; Martínez-Barahona, E.; Barreto Martín,
135
+ E. (2026). *Luz y Taquígrafos: Parliamentary Debates in the Second Spanish Republic, 1931–1945*.
136
+ Harvard Dataverse. https://doi.org/10.7910/DVN/THQCMI
137
+ - Rodrigues-Silveira, R.; García-Díez, F.; Llamazares, I.; Martínez-Barahona, E.; Barreto Martín,
138
+ E. (2026). *Afinidades Elegidas: Parliamentary Cosponsorship Networks of the Spanish Second
139
+ Republic (1931-1939)*. Harvard Dataverse. https://doi.org/10.7910/DVN/CGOCUS
140
+
141
+ El código tiene licencia MIT, y los datos, CC BY 4.0.
142
+
143
+ ---
144
+
145
+ ## English
146
+
147
+ An MCP server to query two datasets on the Congress of Deputies of the Spanish Second Republic
148
+ from Claude, ChatGPT, Cursor, Antigravity, OpenCode or any MCP-capable assistant:
149
+
150
+ - **[Luz y Taquígrafos](https://doi.org/10.7910/DVN/THQCMI)**: the plenary debates, 1931-1939, plus
151
+ five sessions in exile in 1945. That is 121,700 rows in 755 sessions, each intervention linked to
152
+ its deputy.
153
+ - **[Afinidades Elegidas](https://doi.org/10.7910/DVN/CGOCUS)**: the 1,560 collectively signed
154
+ initiatives, with their full text, 13,028 signatures, the co-authorship network and its published
155
+ network metrics.
156
+
157
+ Both are in Harvard Dataverse under CC BY 4.0, and the server joins them. From a measure it jumps
158
+ to the debate where the measure was read and defended; from a deputy's position in the network, to
159
+ what that deputy said on the floor.
160
+
161
+ ```bash
162
+ claude mcp add luz -s user -- uvx luz-mcp # Claude Code
163
+ uvx luz-mcp download # the data, once (about 210 MB, in ~/.luz)
164
+ ```
165
+
166
+ The tools are listed in the table above. What to keep in mind:
167
+
168
+ - **There is no sex variable.**
169
+ - **Not all rows are speech.** `SUMARIO` and `COMENTARIOS` rows have `dm_speech = 0`.
170
+ - **There are two sets of party labels.** Compare voice with seats using the `reg_*` labels, those
171
+ of the revised register.
172
+ - **The two datasets label the second legislature differently:** 1933-1935 and 1933-1936.
173
+ - **The network metrics are the published ones,** checked on import against the edge list.
174
+ - **Some signature lists are truncated.**
175
+ - **The chair is left out of `speech_by_network` by default.** It signs no initiatives but speaks
176
+ in every sitting.
177
+ - **Libraries are written for the Luz y Taquígrafos explorer with the row numbers of version 3.**
178
+ Import them there only with the version 3 CSV loaded.
179
+
180
+ luz-mcp is a profile of the [parlaibero-mcp](https://github.com/rodrodr/parlaibero-tools) engine.
181
+ The code is MIT-licensed; the data are CC BY 4.0. Cite each dataset with its version.
@@ -0,0 +1,157 @@
1
+ # luz-mcp · Segunda República
2
+
3
+ **Español** · [English](#english)
4
+
5
+ Servidor MCP para consultar, desde Claude, ChatGPT, Cursor, Antigravity, OpenCode o cualquier
6
+ asistente de IA compatible, dos conjuntos de datos del Congreso de los Diputados de la Segunda
7
+ República española:
8
+
9
+ - **[Luz y Taquígrafos](https://doi.org/10.7910/DVN/THQCMI)**: los debates del pleno de 1931 a 1939,
10
+ más cinco sesiones del exilio en 1945. Son 121 700 filas en 755 sesiones, cada intervención con su
11
+ diputado.
12
+ - **[Afinidades Elegidas](https://doi.org/10.7910/DVN/CGOCUS)**: las 1 560 iniciativas firmadas
13
+ colectivamente, con su texto íntegro, sus 13 028 firmas, la red de coautorías y sus métricas de
14
+ red publicadas.
15
+
16
+ Los dos están en Harvard Dataverse con licencia CC BY 4.0, y el servidor los cruza: de una medida
17
+ salta al debate en que se leyó y se defendió, y de la posición de un diputado en la red, a lo que
18
+ dijo en el pleno.
19
+
20
+ ## Instalación
21
+
22
+ Requisito: [uv](https://docs.astral.sh/uv/getting-started/installation/).
23
+
24
+ **Claude Code**
25
+
26
+ ```bash
27
+ claude mcp add luz -s user -- uvx luz-mcp
28
+ ```
29
+
30
+ **Otros clientes** (bloque `mcpServers` de su configuración):
31
+
32
+ ```json
33
+ { "mcpServers": { "luz": { "command": "uvx", "args": ["luz-mcp"] } } }
34
+ ```
35
+
36
+ Los datos se descargan una vez, con la herramienta `download_data` o desde la terminal. Son unos
37
+ 210 MB y se guardan en `~/.luz`, o en la carpeta que indique `LUZ_HOME`:
38
+
39
+ ```bash
40
+ uvx luz-mcp download
41
+ ```
42
+
43
+ ## Qué se puede preguntar
44
+
45
+ - *«¿Cómo evoluciona "reforma agraria" frente a "orden público" entre 1931 y 1936?»*: `ngram_viewer`
46
+ - *«¿Qué familias políticas hablan más de lo que les corresponde por escaños en las Constituyentes?»*:
47
+ `share_of_voice`
48
+ - *«¿Qué palabras distinguen a los socialistas de los conservadores, sin la presidencia?»*:
49
+ `distinctive_words`
50
+ - *«Busca las enmiendas de tema agrario defendidas en el pleno y enséñame el debate»*:
51
+ `search_measures` y `get_measure`
52
+ - *«¿Entre qué familias se firman más iniciativas conjuntas en la segunda legislatura?»*:
53
+ `cross_group_coauthorship`
54
+ - *«¿Hablan distinto en el pleno los diputados que articulan la red y los que se quedan en su
55
+ partido?»*: `speech_by_network` y `distinctive_words`
56
+
57
+ ## Herramientas
58
+
59
+ | grupo | herramientas |
60
+ |---|---|
61
+ | datos | `list_datasets` · `download_data` · `get_documentation` · `how_to_cite` · `describe_data` |
62
+ | discurso | `coverage` · `ngram_viewer` · `term_counter` · `term_frequency` · `share_of_voice` · `distinctive_words` · `kwic` · `collocations` · `search_text` · `get_intervention` · `get_session` |
63
+ | bibliotecas | `library_create` · `library_describe` · `library_edit` · `library_combine` · `library_rebuild` · `library_delete` · `library_export` · `library_import` |
64
+ | medidas | `search_measures` · `get_measure` |
65
+ | red | `coauthorship_network` (exporta GraphML o CSV para Gephi, igraph o R) · `deputy_neighbors` · `cross_group_coauthorship` |
66
+ | métricas | `network_metrics` · `structural_roles` (las publicadas, sin recalcular) |
67
+ | discurso × red | `speech_by_network` · `deputy_profile` |
68
+ | reproducibilidad | `query_sql` (SQL de solo lectura) · `export_result` · `query_log` |
69
+
70
+ ## Lo que conviene saber
71
+
72
+ - **No hay variable de sexo** en ninguno de los dos conjuntos, así que nada se desglosa por sexo.
73
+ - **No todo es discurso.** `SUMARIO`, el sumario de cada sesión, y `COMENTARIOS`, que son documentos
74
+ leídos, votaciones y la narración del Diario, son `dm_speech = 0`.
75
+ - **Hay dos juegos de etiquetas.** El de Luz y Taquígrafos (`party`, `party_family`, `ideology`) y el
76
+ del registro revisado de Afinidades (`reg_party`, `reg_family`, `reg_ideology`). Para comparar voz
77
+ y escaños se usan los segundos, porque son los que comparte la lista de miembros. Los ministros
78
+ que hablan en una legislatura en la que no tenían escaño no tienen etiqueta de registro.
79
+ - **La misma legislatura se rotula distinto.** Luz y Taquígrafos dice 1933-1935 y Afinidades,
80
+ 1933-1936.
81
+ - **Las métricas y roles de red son los publicados.** Al cargar los datos, el grado de cada
82
+ diputado se recalcula desde la lista de aristas y se comprueba que coincide.
83
+ - **Algunas listas de firmas están truncadas en el Diario,** y a esas medidas les faltan aristas.
84
+ - **La presidencia queda fuera de `speech_by_network` por defecto.** No firma iniciativas, así que
85
+ aparece entre los diputados aislados de la red, pero habla en todas las sesiones para dar la
86
+ palabra.
87
+ - **Bibliotecas y explorador.** Las bibliotecas se exportan para el
88
+ [explorador de Luz y Taquígrafos](https://rodrodr.github.io/luz_explorer) con los números de
89
+ fila de la **versión 3**. Hay que importarlas allí con el CSV de la versión 3 cargado: el
90
+ explorador acepta también la versión 2, y en ella los mismos números son otras intervenciones.
91
+
92
+ ## Cómo está hecho
93
+
94
+ luz-mcp es un perfil del motor de [parlaibero-mcp](https://github.com/rodrodr/parlaibero-tools), el
95
+ servidor de los 16 parlamentos iberoamericanos. La búsqueda, los recuentos, las bibliotecas y la
96
+ exportación son el mismo código. Este paquete añade:
97
+
98
+ - cómo se leen los dos conjuntos;
99
+ - las tablas de Afinidades;
100
+ - las herramientas de medidas y red.
101
+
102
+ ```bash
103
+ uv run --with pytest pytest # pruebas sin red
104
+ ```
105
+
106
+ ## Cita y licencia
107
+
108
+ Cite cada conjunto con su versión (`how_to_cite`):
109
+
110
+ - Rodrigues-Silveira, R.; García-Díez, F.; Llamazares, I.; Martínez-Barahona, E.; Barreto Martín,
111
+ E. (2026). *Luz y Taquígrafos: Parliamentary Debates in the Second Spanish Republic, 1931–1945*.
112
+ Harvard Dataverse. https://doi.org/10.7910/DVN/THQCMI
113
+ - Rodrigues-Silveira, R.; García-Díez, F.; Llamazares, I.; Martínez-Barahona, E.; Barreto Martín,
114
+ E. (2026). *Afinidades Elegidas: Parliamentary Cosponsorship Networks of the Spanish Second
115
+ Republic (1931-1939)*. Harvard Dataverse. https://doi.org/10.7910/DVN/CGOCUS
116
+
117
+ El código tiene licencia MIT, y los datos, CC BY 4.0.
118
+
119
+ ---
120
+
121
+ ## English
122
+
123
+ An MCP server to query two datasets on the Congress of Deputies of the Spanish Second Republic
124
+ from Claude, ChatGPT, Cursor, Antigravity, OpenCode or any MCP-capable assistant:
125
+
126
+ - **[Luz y Taquígrafos](https://doi.org/10.7910/DVN/THQCMI)**: the plenary debates, 1931-1939, plus
127
+ five sessions in exile in 1945. That is 121,700 rows in 755 sessions, each intervention linked to
128
+ its deputy.
129
+ - **[Afinidades Elegidas](https://doi.org/10.7910/DVN/CGOCUS)**: the 1,560 collectively signed
130
+ initiatives, with their full text, 13,028 signatures, the co-authorship network and its published
131
+ network metrics.
132
+
133
+ Both are in Harvard Dataverse under CC BY 4.0, and the server joins them. From a measure it jumps
134
+ to the debate where the measure was read and defended; from a deputy's position in the network, to
135
+ what that deputy said on the floor.
136
+
137
+ ```bash
138
+ claude mcp add luz -s user -- uvx luz-mcp # Claude Code
139
+ uvx luz-mcp download # the data, once (about 210 MB, in ~/.luz)
140
+ ```
141
+
142
+ The tools are listed in the table above. What to keep in mind:
143
+
144
+ - **There is no sex variable.**
145
+ - **Not all rows are speech.** `SUMARIO` and `COMENTARIOS` rows have `dm_speech = 0`.
146
+ - **There are two sets of party labels.** Compare voice with seats using the `reg_*` labels, those
147
+ of the revised register.
148
+ - **The two datasets label the second legislature differently:** 1933-1935 and 1933-1936.
149
+ - **The network metrics are the published ones,** checked on import against the edge list.
150
+ - **Some signature lists are truncated.**
151
+ - **The chair is left out of `speech_by_network` by default.** It signs no initiatives but speaks
152
+ in every sitting.
153
+ - **Libraries are written for the Luz y Taquígrafos explorer with the row numbers of version 3.**
154
+ Import them there only with the version 3 CSV loaded.
155
+
156
+ luz-mcp is a profile of the [parlaibero-mcp](https://github.com/rodrodr/parlaibero-tools) engine.
157
+ The code is MIT-licensed; the data are CC BY 4.0. Cite each dataset with its version.
@@ -0,0 +1,261 @@
1
+ # Plan · MCP de *Luz y Taquígrafos* y *Afinidades Elegidas*
2
+
3
+ > **Estado: CONSTRUIDO** (2026-10-04), fases A, C, D y E; faltan la B y la F (publicar
4
+ > parlaibero-mcp 0.4.0 y luz-mcp 0.1.0, que publica el investigador, y crear el repositorio).
5
+
6
+ **Resultado de las puertas (2026-10-04):**
7
+ 1. parlaibero-mcp 0.4.0: 38 pruebas; la batería de 21 llamadas da la misma salida que la 0.3.0. La única
8
+ diferencia era el orden de los empates de `term_frequency(by='session')`, arbitrario ya en la 0.3.0, y
9
+ se ha fijado.
10
+ 2. Las cifras publicadas se reproducen todas:
11
+ - Luz y Taquígrafos: 121 700 filas, 755 sesiones y 108 291 de discurso;
12
+ - Afinidades Elegidas: 1 560 medidas, 13 028 firmas, 65 051 aristas, 1 446 fichas, 1 026 diputados,
13
+ 912 con coautoría y 782 medidas defendidas.
14
+ 3. Comprobaciones independientes, todas a cero o completas:
15
+ - ninguna fila de inicio o de defensa falta ni cae en otra fecha;
16
+ - ningún defensor es otro diputado;
17
+ - el grado recalculado coincide en los 2 128 diputados-periodo;
18
+ - los roles concuerdan con las métricas.
19
+
20
+ 440 filas de habla de 14 personas que hablan en una legislatura sin escaño en ella (ministros) no
21
+ tienen etiqueta de registro, y así se declara.
22
+ 4. Ida y vuelta contra el motor real del explorador de Luz: **carga la V3 sin avisos** (121 700 filas) e
23
+ importa y reexporta una biblioteca del MCP sin una sola diferencia (605 items), reconociendo la fuente.
24
+ Por eso el corpus se llama `2REP_Diaries`, como en el explorador, y la decisión (a) no exige cambiarlo:
25
+ basta con cargar allí la V3.
26
+ 5. 8 pruebas sin red de luz-mcp y una prueba de punta a punta por el protocolo MCP con las 36
27
+ herramientas.
28
+
29
+ Hallazgo de las pruebas: en `speech_by_network`, la presidencia de la Cámara cae entre los diputados
30
+ aislados (no firma) y les daba 21 774 turnos; sin ella son 77. La presidencia queda fuera por defecto
31
+ (`exclude_chair`).
32
+ > Decidido por el investigador: un **servidor propio** que reutiliza el **motor de parlaibero-mcp** (sin copiarlo),
33
+ > en un **repositorio nuevo**, con las cuatro familias de herramientas de *Afinidades Elegidas*: medidas y firmas,
34
+ > red de coautorías, métricas y roles, y discurso × red.
35
+
36
+ ---
37
+
38
+ ## 1. Qué hay, medido hoy en Dataverse (solo lectura)
39
+
40
+ **Luz y Taquígrafos** — doi:10.7910/DVN/THQCMI, **V3 publicada hoy** (2026-10-03 13:39 UTC), CC BY 4.0.
41
+
42
+ - Un solo archivo de datos, `2REP_Diaries.csv`: 173 899 410 bytes, MD5 `1cc232de…`, separador `;`, todo entre
43
+ comillas, 14 columnas: `id, num_session, order, date, speaker, speech, rep_id, rep_name, district, party,
44
+ party_family, ideology, nwords, legislature`. Más `mapa_v2_v3.json` (12,8 MB), que traduce cada fila de la V3 a
45
+ la fila y el tramo de la V2.
46
+ - 121 700 filas en 755 sesiones, de 1931-07-14 a 1945-11-09 (cinco sesiones del exilio en México).
47
+ - `speaker = "SUMARIO"` (755 filas, `order` 0) y `"COMENTARIOS"` (12 654 filas) marcan lo que no es discurso.
48
+ - **Medido en un borrador local:** en él, `id` coincidía fila a fila con el número de registro del archivo, y
49
+ `num_session` se reinicia en cada legislatura (405 valores para 755 sesiones). La clave de una sesión es, por
50
+ tanto, `(legislature, num_session)`. Esto se vuelve a medir sobre el archivo publicado al construir.
51
+ - **No tiene variable de sexo.** El padrón de diputados «está disponible a petición»: no se publica.
52
+
53
+ **Afinidades Elegidas** — doi:10.7910/DVN/CGOCUS, V2 publicada hoy (archivos con sufijo `_v3`), CC BY 4.0.
54
+
55
+ - `2REP_measures_v3.csv`: 1 560 medidas con texto íntegro, título, tema (13 categorías), primer autor, defensa en
56
+ el pleno, y las filas de *Luz y Taquígrafos* donde empieza el texto (`diaries_id_inicio`) y donde se defiende
57
+ (`diaries_id_defensa`).
58
+ - `2REP_cosponsorship_v3.csv` (13 028 firmas, con `truncada` cuando el Diario no reproduce todas),
59
+ `2REP_coauthor_edgelist_v3.csv` (65 051 pares por medida), `representative_metadata_v3.csv` (1 446 fichas
60
+ diputado-legislatura de 1 026 diputados: partido, familia, ideología, distrito, variantes del nombre; **sin
61
+ sexo**), `representatives_metrics_v3.json` (centralidades, Guimerà-Amaral, ego-redes, perfiles y roles por
62
+ diputado y periodo, más proximidades y comunidades por partido y familia), `representatives_roles_v3.json`,
63
+ diccionarios de partidos y temas, y los registros de correcciones.
64
+
65
+ **Cómo se enlazan.** El `rep_id` de *Luz y Taquígrafos* es el `id_dip` de *Afinidades*: se comprobaron 400 de 400.
66
+ Las medidas apuntan a filas de la V3 (`diaries_id_*`).
67
+
68
+ Tres desajustes que el MCP tiene que resolver, y decir:
69
+
70
+ 1. **Las etiquetas de legislatura no coinciden.** *Luz* usa `1933-1935`; *Afinidades*, `1933-1936`. Se cruza por
71
+ fecha, no por etiqueta.
72
+ 2. **El explorador web público de *Luz* lee la V2**, no la V3: reconoce el archivo de 165 785 782 bytes y su
73
+ número de fila es el de la V2. Una biblioteca exportada con números de la V3 apuntaría allí a otras
74
+ intervenciones. (§6)
75
+ 3. **Su `2REP_Diaries_v3.csv` local no es el publicado** (MD5 distinto: es un borrador anterior a la
76
+ normalización de etiquetas). El MCP descarga siempre de Dataverse.
77
+
78
+ ---
79
+
80
+ ## 2. Arquitectura
81
+
82
+ ```
83
+ parlaibero-mcp 0.4.0 (repo parlaibero-tools, PyPI)
84
+ └─ motor generalizado: almacén, búsqueda, conteo, ngram, kwic, colocaciones, distinctive_words,
85
+ share_of_voice, bibliotecas, exportación — parametrizado por un PERFIL DE COLECCIÓN
86
+ ├─ perfil «parlaibero» (los 16 países; comportamiento idéntico al de hoy, con las 38 pruebas de guarda)
87
+ └─ (expone el perfil como API para otros paquetes)
88
+
89
+ luz-mcp 0.1.0 (repo nuevo, PyPI; depende de parlaibero-mcp >=0.4,<0.5)
90
+ ├─ perfil «luz»: catálogo (2 DOI), lectura del CSV `;`, mapeo de columnas, filtros propios
91
+ │ (party_family, ideology), instrucciones del servidor, formato del explorador de Luz
92
+ ├─ tablas de Afinidades (medidas, firmas, aristas, métricas, roles, diccionarios)
93
+ └─ herramientas de Afinidades (§4)
94
+ ```
95
+
96
+ **El perfil de colección** es lo único nuevo en parlaibero-mcp. Reúne:
97
+
98
+ - el catálogo de conjuntos, con sus DOI y archivos;
99
+ - cómo se lee cada CSV (separador y columnas) y cómo se mapea a las columnas canónicas;
100
+ - qué filas no son discurso;
101
+ - las columnas extra que se pueden filtrar;
102
+ - el texto de instrucciones del servidor;
103
+ - el directorio del almacén;
104
+ - el formato de biblioteca del explorador (nombre del corpus y número de fila).
105
+
106
+ ParlaIbero pasa a ser el primer perfil, y su comportamiento no cambia: lo vigilan las 38 pruebas actuales, más una
107
+ que compara herramienta por herramienta la 0.3.0 con la 0.4.0 sobre la misma base.
108
+
109
+ **Mapeo de *Luz y Taquígrafos* al esquema del motor:**
110
+
111
+ | motor | Luz y Taquígrafos |
112
+ |---|---|
113
+ | `id_int` | `LT` + `id` con ceros, para que sea único y legible: `LT0075580` |
114
+ | `row_n` | `id`, el número de registro, comprobado contra el archivo como en ParlaIbero |
115
+ | `id_session` | `LT` + legislatura + `num_session` |
116
+ | `intervention_order` | `order` |
117
+ | `speaker_raw` · `id_dep` · `speaker_name` | `speaker` · `rep_id` · `rep_name` |
118
+ | `party` · `district` · `legislature` · `date` · `text` | `party` · `district` · `legislature` · `date` · `speech` |
119
+ | `dm_speech` | `0` si `speaker` es `SUMARIO` o `COMENTARIOS`; `1` en el resto |
120
+ | `sex` | vacío: no existe; el servidor lo dice y no ofrece análisis por sexo |
121
+ | extra | `party_family`, `ideology` (filtrables y como grupo en `share_of_voice` y `distinctive_words`) |
122
+
123
+ `n_words` se recalcula con la definición del motor, y la columna `nwords` publicada se conserva aparte, para que
124
+ cualquiera pueda contrastar las dos.
125
+
126
+ Almacén propio en `~/.luz` (`LUZ_HOME`), separado del de ParlaIbero, con sus bibliotecas en su propio archivo.
127
+
128
+ ---
129
+
130
+ ## 3. Herramientas heredadas del motor
131
+
132
+ Funcionan igual que en ParlaIbero:
133
+
134
+ - **búsqueda y lectura:** `search_text`, `get_intervention`, `get_session`;
135
+ - **recuentos en el tiempo:** `ngram_viewer` (por año o por legislatura), `term_counter`, `term_frequency`;
136
+ - **comparación y contexto:** `distinctive_words` (también por familia e ideología), `share_of_voice` (por partido,
137
+ familia o ideología, nunca por sexo), `kwic`, `collocations`;
138
+ - **control de la base:** `coverage`;
139
+ - **SQL, exportación y trazabilidad:** `query_sql`, `export_result`, `query_log`;
140
+ - **las ocho herramientas de bibliotecas.**
141
+
142
+ ---
143
+
144
+ ## 4. Herramientas de *Afinidades Elegidas* (nuevas)
145
+
146
+ **Medidas y firmas**
147
+
148
+ - `search_measures`: por tema principal o secundario, tipo, legislatura, fechas, firmante, primer autor, partido o
149
+ familia de los firmantes, defensa en el pleno, o texto. Devuelve título, tema, firmas y defensa.
150
+ - `get_measure`: el texto íntegro, los firmantes (marcando las firmas ilegibles y las listas truncadas) y la
151
+ defensa. **Salta al debate:** devuelve la intervención de *Luz y Taquígrafos* donde se lee la medida y la de su
152
+ defensa, con los turnos de alrededor.
153
+
154
+ **Red de coautorías**
155
+
156
+ - `coauthorship_network`: la red de una legislatura, de un tema o de un conjunto de medidas. Dice nodos, aristas,
157
+ densidad y componentes, y la escribe en GraphML o en CSV de aristas y nodos, para Gephi, igraph o R.
158
+ - `deputy_neighbors`: la ego-red de un diputado (coautores, peso y partido), por legislatura.
159
+ - `cross_group_coauthorship`: coautorías entre partidos, familias o ideologías. Para cada par de grupos, observado
160
+ frente a esperado e índice E-I. Las proximidades publicadas por partido y familia se leen, no se recalculan.
161
+
162
+ **Métricas y roles** (las publicadas; **no se recalculan**)
163
+
164
+ - `network_metrics`: las métricas de un diputado por periodo, o el ranking de una métrica (centralidades,
165
+ Guimerà-Amaral, ego-redes, perfiles) con filtros por partido, familia o legislatura.
166
+ - `structural_roles`: la distribución de los seis roles por partido, familia o legislatura, y quién ocupa cada
167
+ rol.
168
+
169
+ Antes de dar por buena la tabla, una comprobación independiente recalcula el grado de cada diputado desde la lista
170
+ de aristas y lo compara con el publicado.
171
+
172
+ **Discurso × red**
173
+
174
+ - `speech_by_network`: une a cada diputado su rol o una métrica, y lo que dijo en el pleno. Por ejemplo:
175
+ - cuánto hablan los diputados puente frente a los periféricos;
176
+ - qué palabras los distinguen (`distinctive_words` entre los dos grupos);
177
+ - qué temas defienden en el pleno.
178
+
179
+ Lo hace construyendo **bibliotecas** con las intervenciones de cada grupo, de modo que todas las herramientas
180
+ de texto sirven después sobre ellas.
181
+ - `deputy_profile`: la ficha completa de un diputado: legislaturas y partido, cuánto habla y en qué sesiones, sus
182
+ medidas (firmadas, primeras firmas, defendidas), su posición en la red y su rol.
183
+
184
+ ---
185
+
186
+ ## 5. Avisos que el servidor da al agente
187
+
188
+ - **No hay variable de sexo** en ninguno de los dos conjuntos: nada se analiza por sexo, y se dice si se pide.
189
+ - **Lo que no es discurso:** `SUMARIO` y `COMENTARIOS` (lecturas de documentos, votaciones, narración del Diario)
190
+ son `dm_speech = 0`.
191
+ - **Las listas de firmas truncadas** (`truncada`) dejan incompleta la red de esa medida, y el servidor la marca
192
+ donde pesa.
193
+ - **Tema, título y defensa** se asignaron con modelos de lenguaje y revisión humana, según la metodología
194
+ publicada. El tema es una clasificación, no un dato del Diario.
195
+ - **Las etiquetas de legislatura difieren** entre los dos conjuntos.
196
+ - **Las sesiones del exilio de 1945** se tratan como una base escasa.
197
+ - **Los identificadores solo son estables dentro de una versión:** se cita siempre la versión, y la V2 se traduce
198
+ con el mapa.
199
+
200
+ ---
201
+
202
+ ## 6. Bibliotecas y el explorador de *Luz*
203
+
204
+ El explorador de escritorio guarda las bibliotecas como `2replib/1`, con `corpus = "2REP_Diaries_v3"` y `speech_id`
205
+ igual al número de fila: es el formato de partida del de ParlaIbero. El explorador web público, en cambio, **lee la
206
+ V2**. Hay tres caminos (decisión 2 del §9):
207
+
208
+ - **(a) Solo V3.** Las bibliotecas se exportan con números de la V3. Sirven en cuanto el explorador lea la V3, lo
209
+ que exige actualizarlo aparte: es un cambio en otro repositorio.
210
+ - **(b) V3 y traducción a la V2 con `mapa_v2_v3.json`.** Al exportar para un explorador en V2, cada intervención de
211
+ la V3 se lleva a la fila de la V2 que la contiene. Es una traducción con pérdida: varias filas de la V3 pueden
212
+ caer en la misma de la V2. Al importar desde la V2, una fila se abre en todas sus piezas de la V3. El informe
213
+ dice cuántas se fundieron o se abrieron.
214
+ - **(c) No exportar al explorador de Luz por ahora;** solo CSV o Parquet.
215
+
216
+ Recomendación: **(b)** mientras el explorador siga en la V2, y **(a)** cuando pase a la V3. El código de traducción
217
+ es pequeño, porque el mapa ya está publicado.
218
+
219
+ ---
220
+
221
+ ## 7. Puertas antes de publicar
222
+
223
+ 1. **parlaibero-mcp 0.4.0 no cambia ningún resultado.** Las 38 pruebas pasan, y la comparación herramienta por
224
+ herramienta entre 0.3.0 y 0.4.0, sobre BR, ES y SV, da salidas idénticas.
225
+ 2. **Las cifras publicadas se reproducen:**
226
+ - *Luz y Taquígrafos*: 121 700 filas, 755 sesiones, 755 `SUMARIO` y 12 654 `COMENTARIOS`;
227
+ - *Afinidades Elegidas*: 1 560 medidas, 13 028 firmas, 65 051 aristas, 1 446 fichas y 912 diputados con al
228
+ menos una coautoría;
229
+ - el MD5 de cada archivo es igual al de Dataverse.
230
+ 3. **Comprobaciones independientes:**
231
+ - el grado recalculado desde las aristas coincide con el publicado;
232
+ - cada `diaries_id_inicio` y `diaries_id_defensa` existe y cae en la sesión y la fecha de su medida;
233
+ - el número de fila coincide con el archivo.
234
+ 4. **Ida y vuelta de bibliotecas contra el motor real del explorador de Luz**, como con ParlaIbero, según la
235
+ opción que se elija en el §6.
236
+ 5. **Prueba de punta a punta por el protocolo MCP**, más pruebas sin red con un corpus sintético.
237
+ 6. **README:** sin nombres de parlamentarios en los ejemplos (norma de divulgación del proyecto: cargo, partido y fecha), y
238
+ con la mención de financiación que corresponda (decisión 3 del §9).
239
+
240
+ ---
241
+
242
+ ## 8. Fases
243
+
244
+ | fase | contenido | dónde |
245
+ |---|---|---|
246
+ | A | perfil de colección en el motor; ParlaIbero como primer perfil; la comparación 0.3 = 0.4 | parlaibero-tools |
247
+ | B | publicar parlaibero-mcp 0.4.0 (la publica usted) | PyPI |
248
+ | C | luz-mcp: perfil, descarga, importación, herramientas heredadas, avisos | repositorio nuevo |
249
+ | D | tablas y herramientas de Afinidades; discurso × red | repositorio nuevo |
250
+ | E | bibliotecas y explorador de Luz (§6); puertas del §7 | ambos |
251
+ | F | README ES/EN, CITATION, publicar luz-mcp 0.1.0 (lo publica usted) | repositorio nuevo, PyPI |
252
+
253
+ ---
254
+
255
+ ## 9. Decisiones (del investigador, 3-oct)
256
+
257
+ 1. **Nombre:** paquete `luz-mcp` (`uvx luz-mcp`), repositorio `rodrodr/luz-tools`.
258
+ 2. **Explorador de Luz: (a), solo V3.** Las bibliotecas se exportan con los números de fila de la V3; sirven en el
259
+ explorador cuando este lea la V3 (cambio aparte, en su repositorio). No se traduce a la V2.
260
+ 3. **Sin mención de financiación.**
261
+ 4. **Instrucciones del servidor en inglés**; README en español e inglés.