Creating a form that only show form fields for editing the node title, body, and any fields created using the field API I have created a content type with some field API fields.

How can I create a edit form that allows to edit just the title, the node body, and those fields?

The normal node edit form contains extra form fields that are not necessary for my purpose (i.e. they are not for editing the parts of a node I listed).
I get you want to show a form where the users can enter the values for the fields implemented using the field API, the node body, and the title; other form fields should not be shown. 

Using the following code, you can achieve what you want.

function mymodule_node_form($form, $form_state, $node) {
  global $user;

  if (!isset($form_state['node'])) {
    if (!isset($node-&gt;title)) {
      $node-&gt;title = NULL;
    }
    node_object_prepare($node);
    $form_state['node'] = $node;
  }
  else {
    $node = $form_state['node'];
  }

  $form['#node_edit_form'] = TRUE;

  $form['#attributes']['class'][] = 'node-form';
  if (!empty($node-&gt;type)) {
    $form['#attributes']['class'][] = 'node-' . $node-&gt;type . '-form';
  }

  foreach (array('nid', 'vid', 'uid', 'created', 'type', 'language') as $key) {
    $form[$key] = array(
      '#type' =&gt; 'value', 
      '#value' =&gt; isset($node-&gt;$key) ? $node-&gt;$key : NULL,
    );
  }

  $form['changed'] = array(
    '#type' =&gt; 'hidden', 
    '#default_value' =&gt; isset($node-&gt;changed) ? $node-&gt;changed : NULL,
  );

  $function = node_type_get_base($node) . '_form';
  if (function_exists($function) &amp;&amp; ($extra = $function($node, $form_state))) {
    $form = array_merge_recursive($form, $extra);
  }
  if (isset($form['title']) &amp;&amp; !isset($form['title']['#weight'])) {
    $form['title']['#weight'] = -5;
  }

  $form['#node'] = $node;

  $form['actions'] = array('#type' =&gt; 'actions');
  $form['actions']['submit'] = array(
    '#type' =&gt; 'submit', 
    '#access' =&gt; variable_get('node_preview_' . $node-&gt;type, DRUPAL_OPTIONAL) != DRUPAL_REQUIRED || (!form_get_errors() &amp;&amp; isset($form_state['node_preview'])), 
    '#value' =&gt; t('Save'), 
    '#weight' =&gt; 5, 
    '#submit' =&gt; array('node_form_submit'),
  );
  if (!empty($node-&gt;nid) &amp;&amp; node_access('delete', $node)) {
    $form['actions']['delete'] = array(
      '#type' =&gt; 'submit', 
      '#value' =&gt; t('Delete'), 
      '#weight' =&gt; 15, 
      '#submit' =&gt; array('node_form_delete_submit'),
    );
  }

  // Add the validation handlers.

  field_attach_form('node', $node, $form, $form_state, entity_language('node', $node));
  return $form;
}


This code is taken from node_form(); it is a ripped off version that include only what necessary to allow to enter the title, the body content, and the values for any field implemented using the field API.
As you see, the code still need to define the form validation handler, and the form submission handler. You use the code of node_form_validate() as guideline for your
validation handler. 

The form builder can be used for a menu item as the following one.

function mymodule_menu() {
  $items['mymodule/%node/edit'] = array(
    'title' =&gt; 'Edit', 
    'page callback' =&gt; 'drupal_get_form', 
    'page arguments' =&gt; array('mymodule_node_form', 1), 
    'access arguments' =&gt; array('the permission users should have to see this menu item'), 
  );

  return $items;
}